AbstractRoutingDataSource&交易经理

时间:2011-12-08 17:47:23

标签: java spring datasource spring-transactions

我目前有一个有两个数据源的程序。每个数据源都绑定到一个事务管理器。

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

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

如果我有一个访问两个数据源并发生错误的函数,如果一个数据源回滚,第二个数据源也会回滚吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果你的函数访问数据存储顺序(我的意思是它对第一个数据存储区执行COMMIT并尝试COMMIT到第二个数据存储区),那么如果在第一个COMMIT之后发生错误,则第二个数据源将执行ROLLBACK,但首先 - 保持COMMITED

因此,您必须使用一个数据存储或JTATransactionManager。

答案 1 :(得分:1)

Spring无法回滚已提交的JDBC语句。这就是XADataSources和2阶段提交的目的(通常通过JTA TX管理器)。

您要求尝试自行管理数据的数据不一致,因为这可能会或可能不会起作用,具体取决于何时失败。例如,假设此流程:

  • Start TX
  • 使用ds1
  • 使用ds2
  • 结束TX
    • commit ds2
    • commit ds1

如果ds1上的提交失败,则ds2将保持提交状态。但是,如果ds2上的提交失败,那么整个tx将失败并且ds1将回滚。

另外,您确定始终按照打开(首次使用)的顺序关闭DataSource吗?春天可能会照顾这个,但我不确定。

答案 2 :(得分:0)

默认情况下,自动提交可能已启用。考虑将其设置为关闭并自行管理提交。