【问题标题】:Propagation behaviour of transaction交易的传播行为
【发布时间】:2011-07-29 20:45:05
【问题描述】:

我正在为 spring aop 使用基于注释的声明性方法。 示例代码

ClassA{
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
add()
{
method1();
method2();
method3();

}
}

但我对使用propagation.does传播仍有疑问。Requires_New意味着每个请求都会开始新的事务。

第二个问题:

method2、method3等方法失败会导致事务回滚吗?

如果有人可以帮助我进行交易传播,我将非常高兴。

谁能给我一个真实世界的例子,我们需要参与现有的交易。因为我想象我们在上面的例子中使用的添加功能将独立于所有用户,或者任何其他功能将独立于每个用户是谁打来的。我找不到使用其他传播行为(如 PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW 等)的示例

【问题讨论】:

    标签: java spring transactions spring-aop


    【解决方案1】:

    回答此评论,而不是实际问题:

    事务是特定于会话的或 特定请求 – Vish 3 小时前

    两者都没有。 request 和 session 都是 web 特定的范围,而 Spring Transaction 抽象与 web 技术无关。

    @Transactional 的范围是每个方法调用,因为@Transactional 是通过 Spring AOP 实现的。事务状态保存在ThreadLocal 变量中,这些变量在进入最外层的@Transactional 方法时进行初始化,并在离开时通过提交或回滚清除。整个抽象在 Java 方法级别上工作,因此不需要 Web 容器或从 Web 容器中获益。


    并在下面的评论中回答这个问题:

    感谢@sean,我仍然无法获得 回答其他传播在哪里 像 PROPAGATION_SUPPORTS 这样的行为 ,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW 等被使用。请参考上面 整个问题

    这是我的 cmets 的 Propagation 值列表:

    强制
    支持当前事务,如果 不存在。

    不启动新事务,仅检查事务是否处于活动状态(必须在另一个 @Transactional 方法调用或以编程方式创建的事务中)

    嵌套
    如果是当前事务,则在嵌套事务中执行 存在,表现得像 PROPAGATION_REQUIRED 否则。

    如果存在事务则启动嵌套事务,否则启动新事务。

    从不
    非事务性执行,如果有事务则抛出异常 存在。

    不启动事务。如果存在事务则失败。

    不支持
    非事务性执行,如果有则暂停当前事务 存在。

    不启动事务。暂停任何现有事务。

    必填
    支持当前事务,如果没有则创建一个新事务 存在。

    如果存在事务,则使用该事务,如果不存在,则创建一个新事务。 在 95% 的情况下,这就是您所需要的。

    REQUIRES_NEW
    创建一个新事务,如果有则暂停当前事务 存在。

    无论是否存在现有事务,始终创建新事务。如果有,它将在此方法执行期间暂停。

    支持
    支持当前事务,执行 如果不存在,则非事务性。

    如果一个事务存在,可以使用一个事务,但不需要一个(也不会启动一个新事务)


    在大多数情况下,REQUIRED 是您所需要的(因此它是 @Transactional 注释中的默认值)。除了 REQUIREDREQUIRES_NEW 在使用中,我个人从未见过任何其他值。

    【讨论】:

    • 感谢@sean,在使用其他传播行为(如 PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW 等)的情况下,我仍然无法得到答案。请参阅上面的整个问题
    • 感谢@Sean.so 如果多个请求正在调用同一个方法说 ADD(),REQUIRED 注释将使它们在同一个事务中运行??但我认为所有的 Add() 方法调用交易上会相互独立..还是有点混乱
    • @Vish 不,永远不会。新请求总是意味着新线程中的新方法调用,因此意味着新事务。所有这些事务性的东西都发生在一个方法调用中,即最外层的方法调用中。当外部方法调用内部事务方法时会变得很棘手,但是调用外部方法两次意味着两个事务,无论是否在 Web 上下文中。
    • +1 精彩的解释。请您解释一下 > 事务状态保存在 ThreadLocal 变量中,当进入最外层的@Transactional 方法时初始化这些变量,离开时通过提交或回滚清除。
    • @Sean Patrick Floyd 请解释传播 NEVER 和根本不使用 Transactional 标记方法之间的区别
    【解决方案2】:

    事务传播指示给定方法在调用时的行为。 REQUIRES_NEW 表示应始终启动新事务,即使有正在进行的事务。

    例如,如果method1() 定义了REQUIRES_NEW,那么它将在新事务中执行。

    一个异常会回滚当前的活动事务,是的。

    【讨论】:

      【解决方案3】:

      是的。 Requires_New 表示每个请求都会开始新的事务。并且是方法2,方法3中的失败将导致事务回滚,具体取决于回滚属性。 检查Transactional 属性。

      【讨论】:

      • 事务是特定于会话或特定于请求的
      猜你喜欢
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 2010-12-13
      • 2011-01-21
      相关资源
      最近更新 更多