我目前有一个有两个数据源的程序。每个数据源都绑定到一个事务管理器。
<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>
如果我有一个访问两个数据源并发生错误的函数,如果一个数据源回滚,第二个数据源也会回滚吗?
谢谢!
答案 0 :(得分:1)
如果你的函数访问数据存储顺序(我的意思是它对第一个数据存储区执行COMMIT并尝试COMMIT到第二个数据存储区),那么如果在第一个COMMIT之后发生错误,则第二个数据源将执行ROLLBACK,但首先 - 保持COMMITED
因此,您必须使用一个数据存储或JTATransactionManager。
答案 1 :(得分:1)
Spring无法回滚已提交的JDBC语句。这就是XADataSources和2阶段提交的目的(通常通过JTA TX管理器)。
您要求尝试自行管理数据的数据不一致,因为这可能会或可能不会起作用,具体取决于何时失败。例如,假设此流程:
如果ds1上的提交失败,则ds2将保持提交状态。但是,如果ds2上的提交失败,那么整个tx将失败并且ds1将回滚。
另外,您确定始终按照打开(首次使用)的顺序关闭DataSource吗?春天可能会照顾这个,但我不确定。
答案 2 :(得分:0)
默认情况下,自动提交可能已启用。考虑将其设置为关闭并自行管理提交。