栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring事务@Transactional注解原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring事务@Transactional注解原理

笔记大纲
  • 1.@EnableTransactionManagement注解原理
    • 1.1 AutoProxyRegistrar(AOP的支持)
    • 1.2 ProxyTransactionManagementConfiguration(事务支持)
  • 2.Spring事务基本执行原理
  • 3.Spring事务传播机制
  • 4.TransactionSynchronization事务同步器

1.@EnableTransactionManagement注解原理

这个注解的作用不言而喻,就是开启Spring对事务管理的支持。和其他的Enable注解类似,他的底层原理就是通过ImportSelector接口向IOC容器中放入了2个Bean:

  - AutoProxyRegistrar:开启AOP的支持,底层就是一个PostProcessor。
  - ProxyTransactionManagementConfiguration:事务切面功能的具体实现。
1.1 AutoProxyRegistrar(AOP的支持)

这个Bean的作用就是向IOC容器中注册了一个AbstractAdvisorAutoProxyCreator的实现类,这个抽象类就是AOP的核心实现。所以这个Bean说白了也就是BeanPostProcessor,在Spring Bean初始化后会进行对Advisor的寻找,然后判断当前Bean是否需要进行AOP并且是否有符合的切点,然后进行AOP的操作。

1.2 ProxyTransactionManagementConfiguration(事务支持)

这也是一个配置类,但是它又定义了3个Bean:

     - `BeanFactoryTransactionAttributeSourceAdvisor`:相当于一个Advisor。
     - `AnnotationTransactionAttibuteSource`:用来检查某个类或者方法上是否添加了@Transactional注解。
     - `TransactionInterceptor`:具体的事务代理逻辑,如果某个类存在@Transactional注解,那么在运行事务切到的方法时,就会先调用这个TransactionInterceptor的invoke中进行事务的开启。
2.Spring事务基本执行原理
  1. Bean的生命周期中,初始化后阶段,通过BeanPostProcessor机制,经过InfrastructureAdvisorAutoProxyCreator的后置处理方法检查当前初始化的Bean是否存在@Transactional注解,随之生成一个代理对象。
  2. 在外部调用这个代理对象的事务方法的时候,命中MethodInterceptor拦截,检查当前方法是否有匹配的Advisor,有则执行对应的invoke方法,在invoke方法里定义了事务的实现原理。
  3. 利用配置好的PlatformTransactionManager事务管理器新建一个数据库连接。
  4. 修改这个Connection的提交模式autoCommit为false,否则每一条SQL都要自动提交。
  5. 执行MethodInvocation.proceed( )方法,这里面就会调用我们自己的方法逻辑,例如SQL的执行。
  6. 执行结束,如果没有抛出异常则提交,否则回滚。
3.Spring事务传播机制

如果需要达到不同方法对事务控制手段的变化,则需要引入事务传播机制的特性。例如A方法调用B方法,如果希望A和B的不处于同一个事务那么原理如下:

  1. 代理对象执行MethodInvocation.proceed()之前会利用事务管理器新建一个数据库连接conn1。
  2. 将conn1的提交模式autoCommit改为false。
  3. 将conn1这个连接设置到ThreadLocal中。
  4. 执行具体的业务逻辑SQL。
  5. 如果A方法中调用了B方法(代理对象调用):
    1. 代理对象执行B方法之前,将conn1进行挂起,将conn1从ThreadLocal中移除,封装到一个挂起对象里。
    2. 事务管理器新建另一个数据库连接conn2。
    3. 重复刚才的动作:设置autoCommit = false,将conn2放入ThreadLocal。
    4. 执行B方法的业务逻辑SQL。
    5. B方法执行结束,拿到ThreadLocal中的conn2,进行commit提交动作。
    6. 提交了conn2后,将conn1的挂起对象进行恢复,将conn1再次放入ThreadLocal中。
  6. A方法执行结束,从ThreadLocal中拿到conn1,进行commit提交动作。

事务是建立在数据库连接Connection上的,如果A和B方法都处于同一个连接,如果B方法报错了,即便是A方法捕获,依然会全部回滚。

4.TransactionSynchronization事务同步器

这个事务同步器可以用来监听事务的状态,一旦事务状态发生了改变就会以回调的方式触发对应的逻辑。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013228.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号