1
image.png

2
image.png

3

image.png

4
image.png

5
image.png

6
image.png

7
image.png

8
image.png

spring的事务是基于AOP和动态代理的。话不多说,直接来到TransactionInterceptor的invoke方法,首先会获得事务的配置属性(#1),接着获取事务的属性,获取事务管理器DataSourceTransactionManager对象,判断reactor的适配,这里可以不用关注。将DataSourceTransactionManager封装为PlatformTransactionManager。

创建事务

先会创建一个DataSourceTransactionObject对象(#2),然后通过事务同步管理器TransactionSynchronizationManager获取一个连接持有者对象(#3),但此时获取到连接为null,继续往下,一轮判断,会走到默认的传播属性的判断中(#4),来到startTransaction方法中,调用doBegin方法,在这里获取真正的数据库连接(#6),设置@Transactional中的属性到当前事务对象中,将当前数据库连接放入ThreadLocal对象中,那是为了保证后续的ORM框架与service层使用同一个数据库连接实现提交与回滚(#7),然后执行业务方法,若业务方法抛出异常,则进行回滚操作,在这里有不少人说,如果调用this对象无法回滚,其实是对spring的切面没有理解到家,因为在业务方法里用this调用一个有@Transactional的方法,当前的this对象为service类自身,而非spring为其生成的代理对象,那么走普通的成员方法是不具备增强功能的,也就是说,不会执行TransactionInterceptor的invoke方法。