我有一个复杂的情况,我必须使用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>
答案 0 :(得分:4)
您需要一个支持两阶段提交(XA)的全局事务管理器。有几个独立和免费的。我在一个基于Spring的项目中使用了Bitronix,但也有Atomikos,可能还有其他。见http://en.wikipedia.org/wiki/Java_Transaction_API#Opensource_JTA_implementations
答案 1 :(得分:4)
您可以使用Spring的JtaTransactionManager来确保两个数据库都使用单个事务管理器进行交易。
注意,您必须选择一个底层实现,它可以是容器的一个:例如: WebLogic,WebSphere和OC4J等......或者是独立的,甚至是开源的:例如: Atomikos
XA事务管理使事情变得复杂(配置/性能/问题解决/维护/等)。在很多情况下,聪明的模式可以避免 。
为了深入了解您是否需要使用XA(例如分布式)事务管理器,请查看Spring自己的Dave Syer撰写的这篇精彩文章:Distributed transactions in Spring, with and without XA
答案 2 :(得分:0)
对于通过多个数据源进行路由,您可以使用abstractRoutingDataSource,但如果您有一个需要影响另一个的rollbackack,则需要一个JtaTransactionManager来进行分布式txn管理。