春天的@Transactional(propagation = Propagation.REQUIRED)?

时间:2018-02-26 08:39:17

标签: java spring transactions propagation

如果我有以下代码:

@Component
public class A{ 

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

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

在此代码示例中打开Spring的事务数是多少?

3 个答案:

答案 0 :(得分:3)

没关系。从b()致电a()时,它无法通过代理,因此b()上的任何交易属性都不会被考虑。

如果通过代理(即在课堂外)调用a()b()并且尚未处理正在进行的事务,示例代码将打开1个事务。

答案 1 :(得分:3)

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

  

在代理模式(默认设置)下,只有外部方法调用   通过代理进入是截获的。这意味着   自调用,实际上是目标对象调用中的一个方法   目标对象的另一种方法,不会导致实际的   即使调用的方法被标记,运行时的事务也是如此   @Transactional

答案 2 :(得分:1)

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

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

0-如果已有,则为零,因为它将被重用。