今天根据具体的业务代码场景去分析spring事务的源码流程,其中事务传播属性还是PROPAGATION_REQUIRED
首先看下第一种业务场景,testTransaction1方法上加了@Transactionl注解,注解中调用了insertTransactionOne(),insertTransactionTwo()方法,这两个方法上面也都加了@Transactionl注解
首先看testTransaction1()方法,上节已经说了会创建数据库连接connection并与ThreadLocal绑定,此时事务状态newTransaction=true,表示这是新开启的事务。这些流程上节已经看过了,再看方法transactionOne.insertTransactionOne(),这个时候同样要去开启事务执行到了getTransaction方法中从ThreadLocal中获取数据库连接,此时就会判断isExistingTransaction方法,明显是存在的,就会去执行handleExistingTransaction方法
handleExistingTransaction方法的主要功能:
1、如果当前被调用的方法insertTransactionOne的事务传播属性为PROPAGATION_NESTED,那么就会将testTransaction1方法开启的事务挂起。
2、如果当前被调用的方法insertTransactionOne的事务传播属性为PROPAGATION_REQUIRED,那么就会将newTransaction属性设置为false,这个留意后面提交事务的时候有使用,然后就会去调用insertTransactionOne的原始方法,可以看到当前insertTransactionOne跟testTransaction1是在同一个事务中了。
当testTransaction1()方法执行完毕进行commit方法的时候,这里因为status.isNewTransaction为false,所以并不会执行testTransaction1方法的提交操作。