@Transactional Spring 链接和自调用

@Transactional Spring chaining and self invoking

我想知道从同一 class 的私有方法调用链接 @Transactional 方法调用的潜在副作用。从研究来看,这似乎是 Spring 的限制并且可能导致副作用,但是如果相应的 class 调用作为单独的 class 调用也有 @Transactional 注释怎么办?如果B失败,B是否回滚A?

@Service
public class A {
    @Autowired
    private B myB;

    @Transactional
    private void transactionA(){
        myB.transactionB();
    }

    public void doTransactionA() {
        transactionA();
    }
}

@Service
public class B {
    @Transactional
    private void transactionB(){
        //throw an exception
    }
}

首先。

When using proxies, you should apply the @Transactional annotation only to methods with public visibility

因此,如果您只想 运行 标准 Java Proxies,请记住这一点。
任何其他情况都包含在 CGLIB 中.

无论如何,这取决于。 @Transactional 注解支持事务传播。

  • PROPAGATION_REQUIRED:为应用设置的每个方法创建一个逻辑事务范围。基本上每个 "nested" 方法调用都会加入一个现有事务,如果有的话。
  • PROPAGATION_REQUIRES_NEW:对每个受影响的事务范围使用完全独立的事务。每个带注释的方法都有自己的事务。
  • PROPAGATION_NESTED:使用具有多个可以回滚到的保存点的单个物理事务。基本上,如果嵌套调用失败,只有那个调用会回滚,然后继续执行。

要获得更好的概述,请参阅 docs