春季交易暂停如何运作?

2022-09-03 14:48:10

我的问题基本上和这里一样,但我对答案不满意,所以我写了这个问题。

在Spring框架手册中指出,对于PROPAGATION_REQUIRES_NEW当前交易将被暂停。这实际上是如何实现的?我知道大多数数据库不支持嵌套事务,并且只能在一个连接中运行一个事务。这意味着你不能只是“不使用”原始事务并启动一个新事务 - 在启动新事务之前,您必须提交或回滚原始事务。

例:

START TRANSACTION
SELECT ...
UPDATE ...
-- Now we run method with PROPAGATION_REQUIRES_NEW
-- How do we "suspend" transaction so we can start new one?
START TRANSACTION
UPDATE ...
COMMIT
-- We returned from the method, result was commited
-- Now we'd like to "unsuspend" the original transaction so it can be commited/rollbacked, but how?

或者这可能是使用另一个连接(会话对象)实现的?以便我们停止使用原始连接并创建一个可以开始新事务的新连接?

我在这里错过了一些如此明显的东西,以至于没有人愿意解释它(至少在Spring docs,Spring in Action,Spring persistence with Hibernate中没有)。

多谢!


答案 1

挂起事务的要点是将线程的当前事务更改为新事务。这与嵌套事务的语义不一致,因为新的和挂起的事务彼此完全独立。没有连接级 API 支持挂起事务,因此必须使用其他连接来完成此操作。如果您将 JTA 与 Spring 一起使用,则由 JTA 事务管理器完成。如果您使用的是 DataSourceTransactionManager,则可以查看代码,看到它会将当前连接保存为“挂起的资源”,并从数据源获取新事务的新连接。


答案 2

推荐