Spring中的事务挂起是如何工作的?

20

我的问题基本上与这里相同,但我对答案不满意,所以写了这个问题。

在Spring Framework手册中,它说明了对于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?

还是可能使用另一个连接(Session 对象)来实现?这样我们就停止使用原始连接并创建一个新的连接,在那里我们可以开始新的事务?

我在这里错过了一些显然的东西,没有人愿意解释它(至少不在 Spring 文档中,Spring in Action,Spring persistence with Hibernate)。

非常感谢!

1个回答

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

我之前认为嵌套异常不适合用于暂停事务,谢谢您的回复,现在我明白了。 - qbd
如果第二个交易需要被暂停的交易锁定的资源怎么办? - PJ_Finnegan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接