@Transactional Spring链接和自我调用

时间:2019-02-14 19:56:31

标签: java spring-mvc spring-transactions

我想知道链接@Transactional方法调用从同一个类的私有方法调用的潜在副作用。通过研究,这似乎是Spring的局限性,并且可能导致副作用,但是如果相应的类调用为也具有@Transactional Annotation的单独的类怎么办?如果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
    }
}

1 个答案:

答案 0 :(得分:0)

首先。

  

使用代理时,应应用@Transactional批注   仅适用于公开可见的方法

因此,如果您只想在标准Java Proxies上运行,请记住这一点。
CGLIB涵盖了其他情况。

无论如何都取决于。 @Transactional批注支持事务传播。

  • PROPAGATION_REQUIRED:为应用设置的每种方法创建一个逻辑事务作用域。基本上,每个“嵌套”方法调用都将加入现有事务(如果有)。
  • PROPAGATION_REQUIRES_NEW:对每个受影响的交易范围使用完全独立的交易。每个带注释的方法都有自己的事务。
  • PROPAGATION_NESTED:使用具有多个可还原到的保存点的单个物理事务。基本上,如果嵌套调用失败,则仅回滚该嵌套调用,然后继续执行。

有关更好的概述,请参见docs