Spring中事务的实现原理

背景:最近的项目中需要用到Spring的事务管理相关的知识,以前也了解过Spring的事务管理,但是仅仅止步于会用,这一次借着这次机会,深入源码分析一下Spring是如何实现事务的。

前面已经有一篇文章讲过了如何在Spring中使用声明式事务,并对一些特性进行了讲解,具体如下:Spring事务管理-使用基础

这一篇文章从SpringBoot启动出发,到Spring实现事务管理,从源码角度,分析其实现原理, 主要分为以下几个部分:

(1)SpringBoot怎么启动Spring的事务管理的

(2)Spring的事务管理实现原理

(3)基于JDK的动态代理的AOP是如何与Spring事务结合的(Spring事务管理是基于AOP实现的)。

1. SpringBoot启动事务原理分析

要理解Spring的事务管理,首先要从SpringBoot启动Spring事务的流程开始,初步理解下Spring事务运行机制。

基于SpringBoot的autoconfiguration机制,可以得到如下启动流程图:
这里写图片描述

当我们的启动类Application上,加上了 @EnableTransctionManagement 注解就表示使用Spring事务机制来进行事务管理。从上图中我们可以知道SpringBoot启动时,关于事务管理主要分为以下几步:

1)ProxyTransctionManagementConfiguration

(1)自动装配配置类 ProxyTransctionManagementConfiguration,这个类首先注入了AnnotationTransactionAttributeSource,用来读取解析 @Transactional注解,获取需要进行事务管理的方法,并将相关的事务管理配置的参数暴露给Spring。

(2)注入TransactionInterceptor:基于AOP MethodInterceptor实现的声明式事务管理,内部依赖于TransactionManager,TransactionManager是实际的事务管理对象。

(3)注入BeanFactoryTransactionAttributeSourceAdvisor:由AnnotationTransactionAttributeSource驱动的AOP Advisor,用于为@Transactional注解的方法添加一个事务advice通知

2)注入DataSource
这里主要是看你的项目使用的是什么数据源,dbcp、阿里的druid、TDDL等等,然后注入DataSource接口的实现类就OK了。

因为Spring的事务管理是基于数据源的事务实现的,也就是说Spring的TransactionManager是依赖于DataSource的,所以必须先注入这个数据源这个bean.

3)DataSourceTransactionManagerAutoConfiguration
Spring中默认的事务管理器是:DataSourceTransactionManager,事务管理是依赖于DataSource,

4)TransactionAutoConfiguration
这个主要是注入了TransactionTemplate这个bean,这个类主要是用于编程式事务的,当我们需要使用编程式事务的时候,直接注入这个bean, 然后调用相应的接口,实现事务的管理。当我们通过Spring的声明式事务管理的时候,是用不到这个类的。

以上就是SpringBoot启动Spring事务管理的过程,以及相互依赖关系

2. Spring的事务管理实现原理

从前面我们已经了解到,Spring的事务管理是基于TransactionManager,

猜你喜欢

转载自blog.csdn.net/u010853261/article/details/78118619