【问题标题】:How does transaction suspension work in Spring?事务暂停在 Spring 中是如何工作的?
【发布时间】:2013-10-31 20:08:08
【问题描述】:

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

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

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

我在这里遗漏了一些如此明显的东西,以至于没人愿意解释它(至少在 Spring 文档、Spring in Action、Spring 与 Hibernate 的持久性中没有)。

非常感谢!

【问题讨论】:

    标签: java mysql spring hibernate transactions


    【解决方案1】:

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

    【讨论】:

    • 我实际上的印象是嵌套异常不适合暂停事务。感谢您的回复,我现在清楚多了。
    猜你喜欢
    • 2010-12-20
    • 2017-11-12
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多