Spring事务流程图
2023-09-01 00:29:22 0 举报
Spring事务流程图
作者其他创作
大纲/内容
调用AbstractPlatformTransactionManager类中的getTransaction(txAttr)方法,实际上这个方法就是真正去开启事务的方法
PROPAGATION_NEVER
执行业务方法
doBegin
是
把挂起的事务重新设置到TransactionSynchronizationManager中并执行同步器的resume()方法
设置数据库timeOut
PROPAGATION_NOT_SUPPORTED
设置当前数据库隔离级别
是否发生异常
否
调用suspend()方法将当前事务对象挂起返回suspendedResources对象
@Transactional
PROPAGATION_REQUIRES_NEW
对于TransactionManager有一个限制必须是PlatformTransactionManager
不包含事务对象,也不会去建立数据库连接
抛异常
如果当前存在事务,则把当前事务挂起,然后以非事务的方式运行
设置数据库连接的autoCommit为false
提交事务子流程
构造一个TransactionStatus
如果是其他值则会在当前事务中运行
PROPAGATION_NESTED
执行业务方法出现异常,会进行回滚,然后执行完finally中的方法后再将异常抛span style=\
构造并返回TransactionStatus对象,TransactionStatus对象中存在suspendedResources,并更新TransactionSynchronizationManager中的信息
利用数据库连接对象,设置一个savepoint。比如mysql就支持,在一个事务中,可以在某个位置设置一个savepoint,后续可以只回滚到某个savepoint
生成一个joinpointIdentification作为事务的名字
会把当前事务的一些信息设置到TransactionSynchronizationManager中
代理对象执行方法时
触发同步器的afferCommit()
回滚事务子流程
触发同步器的afterCompletion()
得到一个TransactionStatus对象
将PlatformTransactionManager、TransactionAttribute、TransactionStatus构造成为一个TransactionInfo对象,并返回TransactionInfo对象
判断传播机制
查看@Transactional注解上是否指定了TransactionManager如果没有指定,默认获取TransactionManager类型的bean作为TransactionManager
触发同步器的beforeCompletion()
创建事务
触发同步器的BeforeCmooit
doBegin子流程
创建TransactionStatus对象子流程
如果本次开启事务当前线程第一次开启事务,那么获得的事务对象中则没有只有数据库连接对象如果本次开启事务时当前线程中还有事务没有提交,那么获得的事务对象中就拥有数据库连接对象
把获得的数据库连接对象通过TransactionSynchronizationManager设置到当前线程的ThreadLocal中
调用数据库连接对象的commit()
如果事务对象中没有持有数据库连接对象,那么则调用DataSource获取一个数据库连接对象,并设置到事务对象中去
判断获得的事务中是否有数据库连接对象
判断当前异常是否需要回滚
创建事务子流程
TransactionSynchronizationManager中包括了很多ThreadLocal,用来记录当前线程中事务的各种信息,比如事务的名字、事务对象、事务的隔离级别等,所以我们也可以通过TransactionSynchronizationManager在业务代码中来获取事务的一些状态
获取当前正在执行的方法上的@Transactional注解的信息TransactionAttribute
调用数据库连接对象的rollback()
判断是否有事务挂起
1、类加了@Transactional注解2、类中拥有@Transactional注解的方法都会生成代理对象作为bean
持有就表示当前线程中存在事务
不持有就表示当前线程中不存在事务
0 条评论
下一页