【问题标题】:Spring @Transactional propagation propertySpring @Transactional 传播属性
【发布时间】:2015-07-24 02:19:55
【问题描述】:

我有一个关于 Spring 事务传播的问题。我了解不同的 Spring 事务传播,即Propagation.REQUIREDPropagation.REQUIRES_NEW 等。我不清楚的是,在具有不同传播值的嵌套事务的情况下它会如何表现。

例如,如果我使用@Transactional(propagation = Propagation.REQUIRED) 来注释方法m1。如果我调用注释为REQUIRES_NEW 的方法m2。会有什么行为?如果m2 中发生异常,它将回滚m2m1 中的更改,或者仅回滚m1 的更改。 同样m1 注释为REQUIRES_NEWm2REQUIRED

【问题讨论】:

    标签: java spring spring-transactions


    【解决方案1】:

    spring documentation for Transaction Propagation 里解释得很好。

    方法的传播行为定义了 Spring 在进入/退出该方法时的行为方式,以及如果当时事务已经存在(或不存在)会发生什么。

    方法在堆栈上的传播行为(无论调用你的方法)是无关紧要的。

    你的例子:

    外(m1):REQUIRED
    内(平方米):REQUIRES_NEW
    结果:将为 m2 创建一个完全独立的事务,可以单独提交/回滚。具有REQUIRED 的 m1 与 m2 无关。

    外(m1):REQUIRES_NEW
    内(平方米):REQUIRED
    结果:Spring 将在输入 m2 时检查是否存在事务,如果不存在则创建一个。

    【讨论】:

    • 感谢 takteek 提供 Spring 文档的链接。我已经看过那个链接了。我主要研究两种方法具有不同传播级别时的事务行为。以您的第一个示例为例,如果我对方法 m1 进行了一些更改,然后调用 m2,如果 m2 中发生异常会发生什么情况。在 m2 中所做的所有更改都将被回滚,并且 m1 更改会发生什么。如果 m1 中有异常会发生什么。 m2 的更改将被提交或回滚。
    • REQUIRES_NEW 是一个单独的物理事务。 m2 中的异常会导致 m2 事务回滚。只要您阻止该异常在 m1 中重新抛出,m1 就可以正常提交。 m1 的传播设置与 m2 无关。
    • 谢谢。是否可以用一个例子和更详细的解释来解释这一点。我在网上搜索过,但在任何地方都没有找到与此相关的示例。我认为这或多或少是嵌套不同传播但没有足够信息的常见用例。
    • 如果有人能用一个例子来解释这一点,我们将不胜感激。
    猜你喜欢
    • 2017-01-18
    • 2018-05-14
    • 2010-12-09
    • 2012-01-19
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多