【问题标题】:Spring multiple transaction managers, single transactionSpring多个事务管理器,单个事务
【发布时间】:2012-01-17 10:17:35
【问题描述】:

我有一个复杂的情况,我必须使用 2 个不同的数据库,因为我使用了 2 个不同的事务管理器。 Spring 中有没有办法将这些事务管理器链接到单个事务中工作?如果第二个数据源发生异常,第一个数据源的更改应该回滚。

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
 <property name="transactionManager" ref="transactionManager" />
 <property name="transactionAttributes">
  <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
  </props>
 </property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@dummyHost:1521:dummySID" />
 <property name="username" value="owner" />
 <property name="password" value="password" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@dummyHost2:1521:dummySID2" />
 <property name="username" value="owner" />
 <property name="password" value="password" />
</bean>

<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource2" />
</bean>

【问题讨论】:

    标签: spring transactions


    【解决方案1】:

    您可以使用 Spring 的 JtaTransactionManager 来确保两个 DB 都使用单个事务管理器进行事务处理。

    注意,您必须选择一个可以是容器的底层实现:例如WebLogic、WebSphere 和 OC4J 等。或者一个独立的,甚至是一个开源的:例如Atomikos.

    但是

    XA 事务管理使事情变得复杂(配置/性能/问题解决/维护等)。在很多情况下,可以通过巧妙的模式来避免。

    要深入了解您是否需要使用 XA(例如分布式)事务管理器,请查看 Spring 自己的 Dave Syer 撰写的这篇精彩文章:Distributed transactions in Spring, with and without XA

    【讨论】:

      【解决方案2】:

      您需要一个支持两阶段提交 (XA) 的全局事务管理器。有几个独立的和免费的可用。我在一个基于 Spring 的项目中使用了 Bitronix,但也有 Atomikos,可能还有其他。见http://en.wikipedia.org/wiki/Java_Transaction_API#Opensource_JTA_implementations

      【讨论】:

        【解决方案3】:

        对于通过多个数据源进行路由,您可以使用abstractRoutingDataSource,但如果您有一个回滚影响另一个回滚的要求,您需要一个用于分布式 txn 管理的 JtaTransactionManager。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          • 2013-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-22
          相关资源
          最近更新 更多