Spring Transaction 源码解析时序图
2021-07-20 18:55:28 119 举报
Spring Transaction 源码解析时序图
作者其他创作
大纲/内容
调用方法invocation.proceedWithInvocation(),执行被代理类的具体方法(即:我们实现的逻辑代码)该方法被 try{...}catch{...}finally{...}包围。出现异常根据异常类型判断是否需要进行回滚操作
DataSourceTransactionManager
AbstractBeanDefinitionParser
①执行方法doGetTransaction()
具体业务时:调用方法,判断该方法是否为事务操作,如果为事务操作,则调用该 invoke() 方法,使用 aop开始增强
TransactionAspectSupport
将设置提交方式设置为 手动提交con.setAutoCommit(false);
AbstractPlatformTransactionManager
异常后,进入catch阶段,开始数据回滚
获取需要被代理类的 class 即:业务中具体类的class(MVC架构中,事务操作一般都是在service 层,开启事务的话,一般是为 service层)
2
getTransaction() 方法主要就是做一些开启事务前的准备工作。如:1.从IOC 中获取到事务配置的传播属性、隔离级别等2.获取数据库连接3.设置手动提交事务最终返回一个事务状态 TransactionStatus
commitTransactionAfterReturning() 执行 commit 操作提交事务
2.具体业务代码过程(调用具体业务时,便会先进入 invoke()方法,进行相关的代理增强操作)
1
将配置好的事务管理器,builder.addPropertyReference(\"transactionManager\
AbstractSingleBeanDefinitionParser
a
ConnectionHolder
返回代理类的对象Class
调用createTransactionIfNecessary()方法,判断当前执行的被代理类中的方法,是否有配置开启事务。如果没有配置事务,则正常执行方法。如果有配置,则开始创建事务
如果时序图对您有用,请在右上角给点个赞吧。5个赞我能多一张文件,支持作者继续画出更好的时序图给大家,谢谢大家支持配套博客介绍:请搜索CSDN 扛麻袋的少年
注解相关解析,此处介绍<tx:advice>编程式事务
正常执行,不进catch的话,则完成 commit 操作
调用getTransactionAttributeSource()方法,获取配置好的需要开启事务的方法。如我们配置的 insert* 等通配符
p
从 map 获取一个事务连接,是 ThreadLocal 类型,即每一个方法都有自己各自的 resources,相互之间线程安全
TransactionInterceptor
s
rollback() 回滚操作
3.getTranslation() 方法,做一些事务开启前的准备工作。详细介绍,见下方
()
e
扛麻袋的少年 2020-03-18
3.TransactionStatus接口
返回事务管理器类DataSourceTransactionManager
执行doGetResource()方法
执行registerBeanDefinition()方法,将配置注册到 IOC 容器
parse()方法,最终返回一个 BeanDefinitionParser 对象
annotation-driven
并重写了 invoke()方法
TransactionSynchronizationManager
执行parseAttributeSource()方法,解析配置的事务所有属性builder.addPropertyValue(\"transactionAttributeSource\
即:将所有配置属性,都封装在 BeanDefinition 对象中
1.Spring在启动时,解析事务相关配置流程(在启动时,就已经为业务预留了 invoke()方法,用于事务相关操作)
advice
Class<?> targetClass:
3
该拦截器实现了 AOP 中的MethodInterceptor接口
invoke()
调用invokeWithinTransaction()方法开始执行代理操作
该BeanDefintion 中包含有代理类的对象。将执行 代理类的 invoke() 方法
执行 doParse() 开始真正解析
并开始调用 getTransaction() 方法,获取事务状态 TranslationStatus
getResource()
1.TransactionDefinition接口
备注:针对事务管理器这部分,Spring为我们提供了很多实现类:①DataSourceTransactionManager ②HibernateTransactionManager ③JpaTransactionManager ④JtaTransactionManager 等等Spring MVC 中,我们使用的基本都是基于 JDBC 的数据库相关的事务。所以此处基于 DataSourceTransactionManager 事务管理器类介绍
解析配置,首先调用父类的 parse() 方法解析
②调用newTransactionStatus()方法,创建事务状态
init()方法开始初始化事务配置
执行getBeanClass()方法,将代理类的对象也封装到 BeanDefintion中
返回 TransactionInterceptor事务拦截器
TransactionManagementConfigUtils
将当前连接与当前 thread 绑定
r
获取连接:getConnection()
③调用 doBegin() 方法,做一些准备前的工作
2.PlatformTransactionManager接口
TxNamespaceHandler
调用父类 getTransaction() 方法从事务管理器中获取一个事务
TxAdviceBeanDefinitionParser
重点来了↓↓↓:
执行parseInternal()内部解析
Spring Transaction 源码解析时序图
0 条评论
回复 删除
下一页