Spring 本地事务

 主要原理:

 事务的顶层接口:

PlatformTransactionManager
提供了3个方法,在申明式事务中这3个方法都是通过aop 调用的:

1.getTransaction:

 

      进入相关需要被拦截的方法,aop调用getTransaction, 该方法检查ThreadLocal 是否已经绑定了Transaction ,如果没有就直接new 一个Transaction,并设置connection 和其它初始参数。

 

 2.doCommit doRollback

业务方法执行结束后(正常结束或者抛异常)后,由拦截器执行该方法。


关键点:


1.Spring事物管理器进行了上层抽象,我们可以以jdbc 的
DataSourceTransactionManager 事物管理器为切入点,观察代码是如何实现的。

DataSourceTransactionObject 事物是如何绑定到ThreadLoacal的:

 

 

3.事物传播策略如何实现的:



PROPAGATION_REQUIRES_NEW 为例来说,
如果当前线程已经绑定了事物,那么是如何实现新开一个事物的呢?

首先将就是将旧的事物暂停supend(), 具体的暂停过程是讲旧的事物和线程解绑,然后新建一个事物,新的事物执行完毕后,再将旧的事物和线程绑定。
这个过程就是借助DefaultTransactionStatus 来实现的,该类里面有两个关键属性:当前事物,挂起的事物。

 

4.  DataSourceTransactionManager  是基于线程实现的, spring-webflux 中是不支持DataSourceTransactionManager  事物管理的。






posted @ 2019-04-04 14:55  jean zhang  阅读(692)  评论(0编辑  收藏  举报