@Service
public class MyService {
@Transactional
public void methodA() {
// some database operations
methodB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// some other database operations
}
}
这里,即使methodB
上标注了@Transactional
并要求新的事务Propagation.REQUIRES_NEW
,
但是,当methodA
内部调用methodB
时,
这个事务传播行为不会生效,
因为,methodA
内部调用methodB
是直接的Java方法调用
,不会
经过Spring的代理。
说白了就是,
methodA
和 methodB
默认情况下是在同一个事务中的,
因为 methodB
是从 methodA
内部直接调用的,不经过Spring的事务代理,
由于这种直接调用绕过了代理,methodB
上的 @Transactional
注解不会生效,
因此 methodA
和 methodB
的操作都会在同一个事务中执行。