Spring事务的底层实现流程
2021-04-01 15:35:36 18 举报
Spring事务底层实现流程主要包括以下几个步骤:1. 开启事务,通过AOP代理的方式在方法执行前开启事务;2. 执行业务逻辑,将需要处理的业务逻辑交由spring容器管理;3. 提交事务,当业务逻辑执行完毕后,通过AOP代理的方式在方法执行后提交事务;4. 回滚事务,如果在执行业务逻辑过程中发生异常,则通过AOP代理的方式在方法执行后回滚事务。其中,spring事务管理器负责管理事务的生命周期,包括开启、提交和回滚等操作。同时,spring事务管理器还提供了多种事务隔离级别和事务传播行为,以满足不同场景下的需求。
作者其他创作
大纲/内容
加了@Transactional注解的类,或者类中拥有@Transactional注解的方法,都会生成代理对象作为bean
PROPAGATION_NEVER
把获得的数据库连接对象通过TransactionSynchronizationManager设置到当前线程的ThreadLocal中
如果执行业务方法没有出现异常,那么则会执行完finally中的方法后再进行提交
抛异常
doBegin
默认情况下为RuntimeException或Error会回滚
对于TransactionManager有一个限制,必须是PlatformTransactionManager
这个比较简单,就是利用数据库连接对象,设置一个savepoint,比如mysql就支持,在一个事务中,可以在某个位置设置一个savepoint,后续可以只回滚到某个savepoint
需要
持有
代理对象执行方法时
创建TransactionStatus对象子流程
事务挂起就是把事务的连接对象、同步器,事务名字,隔离级别记录到SuspendedResourcesHolder对象中去,并把TransactionSynchronizationManager中的信息全部清空,清空是为了用来记录下一个事务的信息
PROPAGATION_REQUIRES_NEW
doBegin的子流程
构造一个TransactionStatus
获取当前正在执行的方法上的@Transactional注解的信息TransactionAttribute
设置数据库连接的autoCommit为false
开始创建事务
如果事务对象中没有持有数据库连接对象,那么则调用DataSource获取一个数据库连接对象,并设置到事务对象中去
TransactionSynchronizationManager中包括了很多ThreadLocal,用来记录当前线程中事务的各种信息,比如事务的名字、事务对象、事务的隔离级别等,所以我们也可以通过TransactionSynchronizationManager在业务代码中来获取事务的一些状态
调用数据库连接对象的commit()
判断获得的事务对象中是否持有数据库连接对象
回滚事务子流程
PROPAGATION_NOT_SUPPORTED如果当前存在事务,则把当前事务挂起,然后以非事务的方式运行
创建事务子流程
如果是其他值则会在当前事务中运行
不持有就表示当前线程中不存在事务
判断传播机制
其他
调用数据库连接对象的rollback()
将PlatformTransactionManager、TransactionAttribute、TransactionStatus构造成为一个TransactionInfo对象,并返回TransactionInfo对象
调用AbstractPlatformTransactionManager类中的getTransaction(txAttr)方法,实际上这个方法就是真正去开启事务的方法
调用DataSourceTransactionManager中的doGetTransaction()得到一个事务对象,得到的事务对象中可能持有也可能没有持有数据库连接对象
调用suspend()方法将当前事务对象进行挂起,并返回suspendedResources对象
触发同步器的beforeCompletion()
触发同步器的afterCommit
触发同步器的afterCompletion()
提交子流程
不持有
PROPAGATION_MANDATORY
判断当前异常是否需要回滚
但是不包含事务对象,也不会去建立数据库连接
持有就表示当前线程中存在事务
判断是否有事务挂起
构造并返回TransactionStatus对象,TransactionStatus对象中存在suspendedResources,并且更新TransactionSynchronizationManager中的信息
不需要回滚则提交
如果本次开启事务当前线程第一次开启事务,那么获得的事务对象中则没有只有数据库连接对象如果本次开启事务时当前线程中还有事务没有提交,那么获得的事务对象中就拥有数据库连接对象
如果执行业务方法出现异常,则会进行回滚,然后执行完finally中的方法后再将异常抛出
会把当前事务的一些信息设置到TransactionSynchronizationManager中
触发同步器的beforeCommit
创建事务成功后执行业务方法
设置当前数据库连接的隔离级别
PROPAGATION_NESTED
生成一个joinpointIdentification,作为事务的名字
设置数据库连接的timeout
得到一个TransactionStatus对象
PROPAGATION_REQUIRED
查看@Transactional注解上是否指定了TransactionManager,如果没有指定,则默认获取TransactionManager类型的bean作为TransactionManager
如果有则把挂起的事务重新设置到TransactionSynchronizationManager中去,并执行同步器的resume()方法
0 条评论
下一页