@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。
我想知道从同一 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。