Spring AOP源码解析:Spring事务实现原理

请添加图片描述

不用Spring管理事务?

让我们先来看一下不用spring管理事务时,各种框架是如何管理事务的

使用JDBC来管理事务
在这里插入图片描述
使用Hibernate来管理事务
在这里插入图片描述
业务逻辑和事务代码是耦合到一块的,并且和框架的具体api绑定了。当我们换一种框架来实现时,里面对事务控制的代码就要推倒重写,并不一定能保证替换后的api和之前的api有相同的行为。

基于这些问题,Spring抽象了一些事务相关的顶层接口,我们面向接口编程,换框架时只要换具体的实现即可。有点像JDBC API的味道了

在这里插入图片描述

常用api 接口
PlatformTransactionManager 对事务进行管理
TransactionDefinition 定义事务的相关属性,例如隔离级别,传播行为
TransactionStatus 保存事务状态
数据访问技术 PlatformTransactionManager实现类
JDBC/Mybatis DataSourceTransactionManager
Hibernate HibernateTransactionManager
Jpa JpaTransactionManager
Jms JmsTransactionManager

编程式事务管理

使用PlatformTransactionManager

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用TransactionTemplate

当我们直接使用PlatformTransactionManager来管理事务时,有很多模版代码。例如业务代码正常执行,提交事务,否则回滚事务。我们可以把这部分模版代码封装成一个模版类,这样使用起来就很方便了,如下所示
在这里插入图片描述
如下图所示,TransactionTemplate#execute方法就是一个典型的模版方法
在这里插入图片描述
我们可以传入如下2个接口的实现类来执行业务逻辑,TransactionCallback(需要返回执行结果)或TransactionCallbackWithoutResult(不需要返回结果)

声明式事务管理

为了让使用更加简洁,Spring直接把事务代码的执行放到切面中了,我们只需要在业务代码方法上加上一个@Transactional注解即可,这种方式我们最常用哈

使用@Transactional注解

在这里插入图片描述
此时事务相关的定义我们就可以通过@Transactional注解来设置了

源码解析

我们需要在配置类上加上@EnableTransactionManagement注解,来开启spring事务管理功能

TransactionInterceptor#invoke
在这里插入图片描述
TransactionAspectSupport#invokeWithinTransaction
在这里插入图片描述
TransactionAspectSupport#createTransactionIfNecessary
在这里插入图片描述

参考博客

[1]https://www.cnblogs.com/dennyzhangdd/p/9602673.html

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>