我想知道链接@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
}
}
答案 0 :(得分:0)
首先。
使用代理时,应应用@Transactional批注 仅适用于公开可见的方法
因此,如果您只想在标准Java Proxies
上运行,请记住这一点。
CGLIB
涵盖了其他情况。
无论如何都取决于。 @Transactional
批注支持事务传播。
PROPAGATION_REQUIRED
:为应用设置的每种方法创建一个逻辑事务作用域。基本上,每个“嵌套”方法调用都将加入现有事务(如果有)。PROPAGATION_REQUIRES_NEW
:对每个受影响的交易范围使用完全独立的交易。每个带注释的方法都有自己的事务。PROPAGATION_NESTED
:使用具有多个可还原到的保存点的单个物理事务。基本上,如果嵌套调用失败,则仅回滚该嵌套调用,然后继续执行。有关更好的概述,请参见docs。