Spring事务管理使用多个数据源

时间:2014-03-17 05:52:30

标签: java spring transactional

这对你来说可能是一个重复性的问题,但我无法找到(至少我无法理解)一个满意的答案,因此再次提问。

我正在使用两个数据源(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>

==============================
  • 在方法-A之上我使用了@Transactional annotation
  • 在方法-B之上我使用了@Transactional annotation
  • 在方法-C之上我使用了@Transactional(&#34; txManager2&#34;) 注释
  • 在方法-D之上我使用了@Transactional annotation

问题是:

  1. 为什么MySQL的更改没有回滚?
  2. 使用JTA的唯一方法是使用全局事务管理吗? (它是一个遗留系统,这是我需要与两个DB进行交互的唯一地方)
  3. 能否请您指出处理此类案件的示例/教程?
  4. 真诚地感谢您阅读本文!

1 个答案:

答案 0 :(得分:1)

要使其工作,AFAIK您需要使用JTA。如果您在MySQL中使用不支持交易的存储引擎,那么即使这样也无济于事。使用MySQL,only InnoDB and BDB storage engines support transactions

如果您使用MySQL支持事务的存储引擎,则需要为Oracle和MySQL数据源配置XA驱动程序,并确保两个数据源都在容器的事务中登记。然后Spring需要参与同一个事务。您不能使用HibernateTransactionManager,但需要JtaTransactionManager,如this thread中所述。

所以,你需要做的是

  1. 在MySQL上使用InnoDB或BDB存储引擎
  2. 在应用程序服务器中配置XA数据源而不是常规数据源
  3. 在Spring配置上使用JtaTransactionManager