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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 