一尘不染

Spring的交易暂停如何运作?

hibernate

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

在SpringFramework手册中,声明对于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文档,Spring in Action,Spring Persistencewith Hibernate中没有)。

非常感谢!


阅读 376

收藏
2020-06-20

共1个答案

一尘不染

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

2020-06-20