Spring事务@Transactional注解原理

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事务同步器

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minor王智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值