1

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

<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>

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

谢谢!

4

3 回答 3

1

如果您的函数按顺序访问数据存储区(我的意思是它向第一个数据存储区提交并尝试向第二个数据存储区提交),那么如果在第一次提交后发生错误,第二个数据源将执行回滚,但首先 - 保持已提交

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

于 2011-12-08T17:53:22.640 回答
1

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

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

  • 开始发送
  • 使用 ds1
  • 使用 ds2
  • 结束 TX
    • 提交 ds2
    • 提交 ds1

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

另外,你确定你总是按照打开的顺序(第一次使用)关闭数据源吗?春天可能会解决这个问题,但我不确定。

于 2011-12-08T23:33:29.540 回答
0

自动提交可能默认开启。考虑将其设置为关闭并自己管理提交。

于 2011-12-09T06:20:59.067 回答