Java @spring中的事务(传播=传播.必需)?

Java @spring中的事务(传播=传播.必需)?,java,spring,transactions,propagation,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?

如果我有以下代码:

@Component
public class A{ 

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

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

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

来自Spring文档:

所需: 支持当前事务,如果不存在,则创建新事务


它只创建一个事务。

这无关紧要。当从a调用b时,它不会通过代理,因此不会考虑b上的任何事务属性

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

参考传播。需要支持当前事务,如果不存在,请创建一个新事务。你的问题的答案是:

1个事务,如果调用Aa时没有事务


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

我向@pablo添加了一条提示,在您的示例中,您无法看到实际的差异,因为您在同一个对象中调用了您的方法,这使得第二个方法上的@transaction行为透明,没有任何效果:

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


此外,即使创建了一个新事务,它也无法工作,因为它无法代理它。那么需要什么?即使存在事务,U new?也将创建一个新事务。