这对你来说可能是一个重复性的问题,但我无法找到(至少我无法理解)一个满意的答案,因此再次提问。
我正在使用两个数据源(MySQL和Oracle)。以下是执行流程: 主方法-A调用方法-B(写入Oracle DB)然后它(方法-A)调用方法-C(写入mySQL DB)然后它(方法-A)调用方法-D(写入Oracle DB) )。
如果在任何地方发生故障,一切都应该回滚。目前只有Oracle DB中的更改才会被回滚。 mySQL DB没有回滚。
我已经定义了两个交易经理。
=========> First <=========
<tx:annotation-driven transaction-manager="txManager" mode='proxy' proxy-target-class='true’/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
<bean id=“SessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean” parent="AbstractSessionFactory" depends-on="AppConfigHelper”>
<property name="hibernateProperties”>
...
ORACLE DB Properties
</property>
</bean>
<aop:aspectj-autoproxy/>
==============================
=========> Second <=========
<tx:annotation-driven transaction-manager="txManager2" mode='proxy' proxy-target-class='true'/>
<bean id="txManager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory2" />
<qualifier value="CherryTransaction" />
</bean>
<aop:aspectj-autoproxy/>
<bean id="SessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" parent="AbstractSessionFactory2" depends-on="AppConfigHelper">
<property name="hibernateProperties">
...
MYSQL DB Properties
</property>
</bean>
==============================
问题是:
真诚地感谢您阅读本文!
答案 0 :(得分:1)
要使其工作,AFAIK您需要使用JTA。如果您在MySQL中使用不支持交易的存储引擎,那么即使这样也无济于事。使用MySQL,only InnoDB and BDB storage engines support transactions。
如果您使用MySQL支持事务的存储引擎,则需要为Oracle和MySQL数据源配置XA驱动程序,并确保两个数据源都在容器的事务中登记。然后Spring需要参与同一个事务。您不能使用HibernateTransactionManager,但需要JtaTransactionManager,如this thread中所述。
所以,你需要做的是