上篇文章介绍了事务开启,前面介绍了解析adviors。
spring事务源码详解-spring原码(一)https://blog.csdn.net/ke1ying/article/details/131360060
- 事务源码
先从缓存里获取,主要是判断循环依赖是否创建动态代理
进去wrapIfNecessary
先if判断advised是不是需要增强bean
如果是advised增强bean不需要动态代理
再重复判断一下是否不是切入点一些类,是的话加入advised
这里通过getAdvicesAndAdvisorsForBean拿到我们之前配置的advices
通过AopUtils里的find找到我们可以用的advisors
这里主要拿到advisors的pointCut,和配置类里的事务属性源
这里也有缓存,提高性能
当我们的缓存为空,则去解析我们的注解
解析成事务属性transactionAttribute,解析到代表匹配成功
在computeTransaction方法里面,拿到我们最终方法(加入你当前类是个接口,会拿到你实现类的方法)
先根据方法解析,再根据实现类解析
当我们执行具体方法的时候,回来到我们动态代理类。
拿到我们之前解析的事务属性
在try之前开启事务
在catch里面回滚
在最后commit
如果有传播性的话,会根据事务传播行为来确定是否开启。
开启事务用createTransactionIfNecessary方法开启,判断是否有必要开启。
在这个里面会判断传播行为,一个一个判断。