我的applicationContext.xml内容是这样的:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://10.129.68.170:3306/jotm1" />
<property name="username" value="root" />
<property name="password" value="root" />
<!-- 
<property name="validationQuery" value="select current_date()"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
 -->
</bean>
<bean id="sessFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="ds1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/xa/model/User1.hbm.xml</value>
</list>
</property>
</bean> <bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://10.129.68.170:3306/jotm2" />
<property name="username" value="root" />
<property name="password" value="root" />
<!-- 
<property name="validationQuery" value="select current_date()"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
 -->
</bean>
<bean id="sessFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="ds2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/xa/model/User2.hbm.xml</value>
</list>
</property>
</bean> <bean id="User1DAO" class="com.xa.dao.User1DAO">
<property name="sessionFactory">
<ref bean="sessFactory1" />
</property>
</bean>
<bean id="User2DAO" class="com.xa.dao.User2DAO">
<property name="sessionFactory">
<ref bean="sessFactory2" />
</property>
</bean>
<bean id="userServiceDS" class="com.xa.service.UserServiceDS">
<property name="dao1" ref="User1DAO" />
<property name="dao2" ref="User2DAO" />
</bean> <!-- JOTM配置 开始 -->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
<bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm" />
</bean>
<bean id="myService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="myTxManager" />
<property name="target">
<bean class="com.xa.service.UserServiceDS">
<property name="dao1" ref="User1DAO" />
<property name="dao2" ref="User2DAO" />
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
 
</props>
</property>
</bean>
<!-- JOTM配置 结束 -->

</beans>DS方法中的调用是这样的: public void insertBothUser(User1 user1, User2 user2){
this.insertUser1(user1);
if(true){
throw new RuntimeException();
}
this.insertUser2(user2);
}对应的插入方法如下:public void save(User1 transientInstance) {
log.debug("saving User1 instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
在插入第二时手动抛出运行时异常,但结果是第一个仍插入了,事务没有回滚,请各位兄弟指点一二。

解决方案 »

  1.   

    你的
    this.insertUser1(user1);//
                  this.insertUser2(user2);//
    是操作的同一个数据源吗?
      

  2.   

    这两个插入使用不同的dao,对应不同的数据源,使用jta的目的就是为了保证两个都插入成功,如果有异常则两个都不成功。ublic class UserServiceDS implements IUserServiceDS {
    private User1DAO dao1;
    private User2DAO dao2;

    public void insertBothUser(User1 user1, User2 user2){
    this.insertUser1(user1);
    if(true){
    throw new RuntimeException();
    }
    this.insertUser2(user2);
    } public void insertUser1(User1 user1) {
    dao1.save(user1);
    } public void insertUser2(User2 user2) {
    dao2.save(user2);
    } public User1DAO getDao1() {
    return dao1;
    } public void setDao1(User1DAO dao1) {
    this.dao1 = dao1;
    } public User2DAO getDao2() {
    return dao2;
    } public void setDao2(User2DAO dao2) {
    this.dao2 = dao2;
    }
    }
      

  3.   


    如果是同一个数据库,我肯定不使用JTA。JOTM(JTA)不就是为了解决不同数据库的事务问题的么?
      

  4.   

    忘了补充下,如果我不使用hibernate,只使用Spring的jdbcsupport的话是没有问题的,能保证都成功才插入不同数据库的表,但使用了hibernate就不行。所以看起来这个问题应该和hibernate本身的事务管理有关。
      

  5.   

    有点奇怪,楼主用jdbctemplate怎么就行了。使用JTA要用XADataSource的吧,貌似org.apache.commons.dbcp.BasicDataSource没有实现XADataSource吧
      

  6.   

    使用JTA管理多数据库事务,使用的数据源必须是实现了XADataSource的数据源,比如xapool。同时要注意,在配置Hibernate的sessionFactory时,不要注入jtaTransactionManager属性,如果注入为jotm,运行时会报jndi错误。
      

  7.   

    http://blog.csdn.net/soleghost/archive/2006/10/13/1332443.aspx
    看看这个帖子
      

  8.   

    to zl3450341,http://blog.csdn.net/soleghost/archive/2006/10/13/1332443.aspx你说的这个帖子我之前也是看过的,按照它的配置就报jndi的错误;我配置dbcp数据源是按http://huqilong.blog.51cto.com/53638/109109这个帖子说的,但事务就是不回滚。说实话,我都不知道他们怎么说成功了的。最后,根据kslion的思路,事务成功受管理,任务完成,结贴!!
      

  9.   

    <bean id="jdbcdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.221)(PORT=1521)))(CONNECT_DATA=(SID=oracledb)(SERVER=DEDICATED)))" />
    <property name="username" value="extjs" />
    <property name="password" value="123" />  
    </bean>
      

  10.   

    <bean id="dataTypeMapping"    class="org.carf.common.jdbc.oracle.OracleDataTypeMapping" />
    <bean id="lobHelper" class="org.carf.common.jdbc.oracle.OracleLobHelper" />
    <bean id="SequenceIncrementer" class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer" singleton="false">
         <property name="dataSource" ref="jdbcdataSource" />
         <property name="incrementerName" value="SQU_" />
    </bean>  
      

  11.   

    我也遇到你同样的问题,不知道您最后怎么解决的呢?
    可以的话给我的发一个您的配置吧,不知道你还有没有.
    [email protected]