Spring的事务传播机制
事务传播机制
方法A调用方法B,事务的传播机制主要针对被调用方(方法B)
传播行为 | 描述 |
---|---|
required | 默认,如果上下文中存在事务A,则事务B加入到事务A变成一个事务;不存在,则创建一个事务B |
requires_new | 如果上下文中存在事务A,则将上下文的事务A挂起,然后新建一个事务B (事务A的回滚不影响事务B的提交;事务B异常回滚,方法B作为被调用方会将异常抛给方法A,如果方法A捕获处理不会导致事务A回滚,没有捕获处理会导致事务A回滚),执行完新建的事务B后,恢复并执行上下文事务A;不存在事务A,则创建一个事务B |
supports | 如果上下文中存在事务A,则支持事务B加入事务A;不存在,则使用非事务方式执行方法B |
not_supported | 如果上下文中存在事务A,则将事务A挂起,然后以非事务的方式执行方法B;不存在,则以非事务方式执行方法B |
mandatory | 如果下上文不存在事务A,则事务B抛出异常;存在事务A,事务B加入到事务A中 |
never | 如果上下文中存在事务A,则事务B抛出异常;不存在事务A,事务A和事务B以非事务方式执行方法B、A |
nested | 如果上下文中存在事务A,则新建一个A的子事务B,子事务B嵌套在事务A中执行 (事务A的回滚会导致事务B提交后回滚,事务B回滚且异常被捕获处理不影响事务A提交);不存在事务A,则创建一个事务B |
@Transactional
public void transactionalA() {
System.out.println("transactionalA");
transactionalB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void transactionalB() {
System.out.println("transactionalB");
}