Spring多个事务管理器,单个事务

gio*_*_go 7 spring transactions

我有一个复杂的情况,我必须使用2个不同的数据库,我使用2个不同的事务管理器.Spring中有没有办法将这些事务管理器链接到单个事务中?如果第二个dataSource出现异常,则应回滚第一个数据源的更改.

<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>
Run Code Online (Sandbox Code Playgroud)

tol*_*ius 5

您可以使用Spring的JtaTransactionManager来确保使用单个事务管理器来处理两个数据库。

注意,您将必须选择一个基础实现,它可以是容器的实现(例如WebLogic,WebSphere和OC4J等),也可以是独立的甚至是开源的实现:例如Atomikos

然而

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

为了深入了解是否需要使用XA(例如,分布式)事务管理器,请阅读Spring自己的Dave Syer撰写的精彩文章:带有和不带有XA的Spring分布式事务


JB *_*zet 4

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