笔记大纲
- 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事务基本执行原理
- Bean的生命周期中,初始化后阶段,通过
BeanPostProcessor
机制,经过InfrastructureAdvisorAutoProxyCreator
的后置处理方法检查当前初始化的Bean是否存在@Transactional注解,随之生成一个代理对象。 - 在外部调用这个代理对象的事务方法的时候,命中MethodInterceptor拦截,检查当前方法是否有匹配的Advisor,有则执行对应的invoke方法,在invoke方法里定义了事务的实现原理。
- 利用配置好的
PlatformTransactionManager
事务管理器新建一个数据库连接。 - 修改这个Connection的提交模式
autoCommit
为false,否则每一条SQL都要自动提交。 - 执行
MethodInvocation.proceed( )
方法,这里面就会调用我们自己的方法逻辑,例如SQL的执行。 - 执行结束,如果没有抛出异常则提交,否则回滚。
3.Spring事务传播机制
如果需要达到不同方法对事务控制手段的变化,则需要引入事务传播机制的特性。例如A方法调用B方法,如果希望A和B的不处于同一个事务那么原理如下:
- 代理对象执行
MethodInvocation.proceed()
之前会利用事务管理器新建一个数据库连接conn1。 - 将conn1的提交模式
autoCommit
改为false。 - 将conn1这个连接设置到ThreadLocal中。
- 执行具体的业务逻辑SQL。
- 如果A方法中调用了B方法(代理对象调用):
- 代理对象执行B方法之前,将conn1进行挂起,将conn1从ThreadLocal中移除,封装到一个挂起对象里。
- 事务管理器新建另一个数据库连接conn2。
- 重复刚才的动作:设置autoCommit = false,将conn2放入ThreadLocal。
- 执行B方法的业务逻辑SQL。
- B方法执行结束,拿到ThreadLocal中的conn2,进行commit提交动作。
- 提交了conn2后,将conn1的挂起对象进行恢复,将conn1再次放入ThreadLocal中。
- A方法执行结束,从ThreadLocal中拿到conn1,进行commit提交动作。
事务是建立在数据库连接Connection上的,如果A和B方法都处于同一个连接,如果B方法报错了,即便是A方法捕获,依然会全部回滚。
4.TransactionSynchronization事务同步器
这个事务同步器可以用来监听事务的状态,一旦事务状态发生了改变就会以回调的方式触发对应的逻辑。