一个事务可以包括n个子事务,而事务传播规则就是设定这其中的一些机制。
PROPAGATION_REQUIRED 默认
Spring默认的传播级别是PROPAGATION_REQUIRED
。
执行以下代码的结果是另一个事务也被回滚了,相当于另一个事务直接加入到此事务中。
而如果单独执行test2()
则会开启一个新的事务,执行test()
则会直接让内部的test2()
加入到当前事务中。
@Component
public class TestServiceImpl implements TestService{
@Resource
TestMapper mapper;
@Transactional
public void test() {
test2(); //包含另一个事务
if(true) throw new RuntimeException("我是测试异常!"); //发生异常时,会回滚另一个事务吗?
}
@Transactional
public void test2() {
mapper.insertStudent();
}
}
PROPAGATION_SUPPORTS 单独非回滚
我们将test2()
的传播级别设定为SUPPORTS
,那么这时如果单独调用test2()
方法,并不会以事务的方式执行,当发生异常时,虽然依然存在AOP增强,但是不会进行回滚操作,而现在再调用test()
方法,才会以事务的方式执行: