一个事务可以包括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()方法,才会以事务的方式执行: