【问题标题】:@Transactional(propagation = Propagation.REQUIRED) in spring?@Transactional(propagation = Propagation.REQUIRED) 在春天?
【发布时间】:2018-08-05 15:59:01
【问题描述】:

如果我有以下代码:

@Component
public class A{ 

@Transactional(propagation = Propagation.REQUIRED)
public void a(){
    //logic
    b();
 //logic
}

@Transactional(propagation = Propagation.REQUIRED)
public void b(){
    //logic
} 
}

在这个代码示例中有多少事务打开了 Spring?

【问题讨论】:

    标签: java spring transactions propagation


    【解决方案1】:

    没关系。从a() 调用b() 时,它不会通过代理,因此不会考虑b() 上的任何事务属性。

    如果 a()b() 通过代理调用(即在类外)并且没有正在进行的事务,则示例代码有 1 个事务处于打开状态。

    【讨论】:

      【解决方案2】:

      我添加到@pablo 回答通知,在您的示例中您看不到实际差异,因为您在同一个对象中调用您的方法,这使得第二个方法上的@transaction 行为透明而没有效果:

      在代理模式下(默认),只有外部方法调用 通过代理进来的被拦截。这意味着 自调用,实际上是目标对象中的一个方法调用 目标对象的另一种方法,不会导致实际 即使调用的方法标记为 @事务

      【讨论】:

        【解决方案3】:

        引用documentationPropagation.REQUIRED支持当前事务,如果不存在则创建一个新事务。你的问题的答案是:

        1 个事务,如果调用 A#a() 时没有事务。

        0- 如果已经有一个则为零,因为它将被重复使用。

        【讨论】:

          【解决方案4】:

          来自 Spring 文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html

          要求: 支持当前事务,如果不存在则创建一个新事务

          它只创建一个交易。

          【讨论】:

          • 另外,即使创建了一个新事务,它也不会工作,因为它无法代理它。
          • Requires_New 怎么样?
          • 即使存在事务也会创建一个新的。
          猜你喜欢
          • 1970-01-01
          • 2017-07-24
          • 2020-01-09
          • 1970-01-01
          • 2014-03-13
          • 1970-01-01
          • 1970-01-01
          • 2020-06-12
          • 2013-02-13
          相关资源
          最近更新 更多