spring 事务部分源码解析
spring 事务实现原理,本文代码是根据注解式声明式事务所写
源码时序图
源码讲解:
1、获取当前服务的代理对象,这里是使用cglib实现的代理
2、获取本方法上的拦截器,本次只有我们配置的Transactioin拦截器
6、根据@Transaction注解上的属性,创建TransactionDefinition对象,本对象就是事务定义对象
8、部分ORM框架都会继承spring的AbstractPlatFormTransactionManager抽象类或实现PlatformTransactionManager接口
,并根据自己情况具体实现里边方法,主要三个方法
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
9、判断本次操作是否已经在事务中,主要用来根据不通的事务传播来响应不通结果,可根据图进行理解
10、我们这里会调用getTransaction()方法获取TransactionStatus对象该对象是事务各种状态的表示,可以根据里边状态判断事务是否已完成、回滚
11、根据8中不同实现获取数据库连接,设置隔离级别
12、13、返回TranscationStatus得到TranscationInfo
14-15、执行业务方法操作数据无报错提交,异常后回滚如下图
最后放一个直观图
图片来源:https://www.cnblogs.com/yixianyixian/p/8372832.html
为方便查看附上一个事务传播行为
图片来源:https://blog.****.net/pml18710973036/article/details/58607148