【问题标题】:Spring transaction management to work with multiple data sourcesSpring事务管理与多个数据源一起工作
【发布时间】:2014-03-17 05:52:30
【问题描述】:

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

我正在使用两个数据源(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 注释
  • 在方法 B 之上,我使用了 @Transactional 注释
  • 在方法 C 之上,我使用了 @Transactional("txManager2") 注释
  • 在方法 D 之上,我使用了 @Transactional 注释

问题是:

  1. 为什么 MySQL 更改没有回滚?
  2. 让这个工作的唯一方法是使用使用 JTA 的全局事务管理吗? (它是一个遗留系统,这是我需要与两个数据库交互的唯一地方)
  3. 能否请您指出一个处理此类案例的示例/教程?

衷心感谢您阅读本文!

【问题讨论】:

  • 我还有一个问题:

标签: java spring transactional


【解决方案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

【讨论】:

  • 非常感谢 eis@ 的快速回复。让我试试这个设置。
猜你喜欢
  • 2016-09-25
  • 2014-05-27
  • 2019-12-30
  • 1970-01-01
  • 2018-08-03
  • 2011-07-11
  • 2013-04-10
  • 2016-09-15
  • 2016-01-28
相关资源
最近更新 更多