Spring声明式事务
SPring事务实现
Spring声明式事务因为综合了四个方面知识点,所以会显的复杂,其实梳理一下,就会容易理解。
- 数据访问事务功能实现
- 注解@Transactional解析
- AOP
- 自动配置
这是普遍技术优化所呈现的特点:通过封装非业务代码来达到方便的同时结合了更多的技术,导致与最基本的业务实现逻辑越来越远,源码阅读越来越困难,要掌握的知识也更多。
在一定限度内是正确的,毕竟业务是频繁无限的,而源码总是有限的,如果这样优化带来的收益值得我们去增加源码的复杂度,那就应该去优化。
如果想要分析清楚Spring声明式事务,就先应该把自动配置源码的分析先放下,回到业务的流程中。Spring声明式事务的过程其实就是:
- 拿到@Transactional注解以及注解所在的类信息,创建一个代理对象包装这些信息。
- 在执行代理对象映射的目标对象方法时跳转到事务处理,进行我们常用的事务处理
整个Spring声明式事务的实现是按照AOP的流程进行,在其中穿插了对@Transactional注解的解析和事务的代码实现。
建议在学习Spring声明式事务过程之前学会AOP。
Spring及Spring boot 第二章 AOP 总结文
而整个AOP的过程也可以直接分为三步:
1. 拿到Advisor
2. 创建代理对象
3. 在相关事件节点拦截,执行切点方法
再穿插对@Transactional注解的解析和事务的代码实现,整个过程就是这样,从宏观角度来讲就这么回事,只要把这五个过程分析清楚就对Spring声明式事务掌握的差不多了
Spring声明式事务源码实现
Spring声明式事务流程小结
Spring及Spring boot 第四章-第二节 Spring声明式事务管理 @Transaction AOP实现
Spring 声明式事务 事务功能实现
事务功能实现所需组件
事务功能实现组件是如何参与到Spring声明式事务中的
Spring事务——数据库
流程一:获取Advisor
Advisor组件
BeanFactoryTransactionAttributeSourceAdvisor
BeanFactoryTransactionAttributeSourceAdvisor
流程二:解析@Transactional注解
@Transactional注解
AOP 解析@Transactional过程
TransactionAttributeSource组件
其中封装了所有的相关TransactionBeanDefinition。
TransactionAttributeSource接口
AbstractFallbackTransactionAttributeSource(包含了AnnotationTransactionAttributeSource源码)
AbstractFallbackTransactionAttributeSource
TransactionDefinition组件
TransactionAttribute
RuleBasedTransactionAttribute
流程三:创建代理
这个过程没什么可讲的,和Spring AOP实现一模一样。其中没有事务功能的参与,唯一值得看的就是最后代理对象长什么样子。
流程四: 实现拦截
拦截过程实现
Spring及Spring boot 第四章-第二节 Spring声明式事务管理 拦截过程
MethodInterceptor——TransactionInterceptor作为事务处理的主要场景入口
父类 TransactionAspectSupport
TransactionManager组件——真正实现事务功能的开始
AbstractPlatformTransactionManager
AbstractPlatformTransactionManager
DataSourceTransactionManager —— 作为事务管理器封装了我们常见的事务操作
DataSourceTransactionManager
JdbcTransactionManager
TransactionInfo
ConnectionHolder
声明式事务整合数据源的过程
声明式事务处理连接的过程——TransactionSynchronizationManager
TransactionSynchronizationManager
Spring声明式事务 ——自动配置
Spring及Spring boot 第四章-第二节 Spring声明式事务管理 @Transaction 自动配置作用