事务执行流程
2025-03-31 21:09:11 0 举报
spring事务
作者其他创作
大纲/内容
((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this)执行后返回进入点往后执行
提交事务
TransactionSynchronizationManager.bindResource()将数据库资源与当前持有者绑定,即与当前线程绑定
返回执行地方CglibAopProxy.intercept()
事务属性是否为PROPAGATION_MANDATORY
TransactionAspectSupport.invokeWithinTransaction()
不是
检查当前的DataSourceTransactionObject(事务对象)是否持有一个新的ConnectionHolder实例
判断
是
isNewSynchronization当前事务是否是一个新的事务同步
txInfo绑定线程号
设置自动提交
在事务后重置给定的 Connection,关于只读标志和隔离级别resetConnectionAfterTransaction
挂起当前事务suspend
getTransactionSynchronization获取设置
否
回滚到为事务保留的 Savepoint,然后立即释放 Savepoint
是否为新事务
doSetRollbackOnly()将资源事务标记为仅回滚
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus())执行rollback
转化事务管理器asPlatformTransactionManager
判断是否为新的连接持有者
handleExistingTransaction处理事务传播行为相关信息
事务执行流程
processRollback执行事务回滚并返回
设置连接为不自动提交
TransactionSynchronizationManager当前事务是一个新的事务同步,需要进行后续的处理
如果存在这样的事务,尝试将afterCompletion回调注册到现有的(JTA)事务中调用registerAfterCompletionWithExistingTransaction方法,传入当前事务对象和同步对象列表,尝试将回调注册到现有的事务中
createTransactionIfNecessary根据给定的 TransactionAttribute 创建事务
涉及到恢复数据库连接和其他事务资源,以便外层事务可以继续执行
因为在事务完成后,这些同步对象不再需要,需要从管理器中移除
是否为NEVER
处理 throwable,完成交易。我们可能会提交或回滚,具体取决于配置
嵌套事务后执行这里
抛出异常IllegalTransactionStateException
triggerAfterCompletion在finally执行此方法
设置是否允许嵌套事务
如果是,说明当前事务是独立于其他事务的,不需要与其他事务共享连接或资源
通过TransactionStatus实现的SavepointManager API,在现有的 Spring 托管事务中创建保存点。通常使用 JDBC 3.0 保存点。从不激活 Spring 同步
cleanupAfterCompletion完成后进行清理,必要时清除同步,并调用 doCleanupAfterCompletion
是否为NOT_SUPPORTED
AbstractPlatformTransactionManager.rollback回滚事务
判断事务传播行为
processRollback处理实际回滚
方法内是否有嵌套事务
triggerAfterCommit(status)
当前事务是否是一个新的事务同步
isNewTransaction是否为新事物
isNewTransaction判断是否为新事物
事务类型为PROPAGATION_REQUIRED或者PROPAGATION_REQUIRES_NEW或者PROPAGATION_NESTED
获取连接
newTransactionStatus创建一个DefaultTransactionStatus实例
TransactionInfo创建一个信息txInfo
txInfo.getTransactionManager().commit(txInfo.getTransactionStatus())实际提交事务
commitTransactionAfterReturning返回并正常提交事务
TransactionInfo.transactionAttribute信息不为空并且事务设置的rollbackFor为该异常
getSuspendedResources挂起事务不为空
cleanupAfterCompletion在事务完成后执行必要的清理操作
将资源和持有者解绑
执行方法中内容
suspend挂起当前事务
CglibMethodInvocation.proceed()
判断事务是否已完成
prepareTransactionStatus创建一个status
TransactionSynchronizationManager.clearSynchronization()清除当前事务的同步对象
设置保存点,当异常后只回滚当前设置事务的内容
返回事务发起调用地方
判断超时时间<-1
isNewConnectionHolde
prepareTransactionInfo属性和状态对象准备
completeTransactionAfterThrowing执行事务异常处理逻辑
提交该事务
捕获到异常信息
TransactionInterceptor.invoke()
doBegin获取数据库连接并创建ConnectionHolder放到数据资源事务管理器中 DataSourceTransactionObject
检查给定的事务对象是否指向现有事务
存在
是否有挂起事务
ReflectiveMethodInvocation.proceed()
开始
抛出异常信息Transaction is already completed
检查是否有挂起的资源。挂起的资源是指在嵌套事务中,外层事务被挂起时保存的状态
抛出异常Invalid transaction timeout
将ConnectionHolder绑定到txObject,并设置是否为新连接持有者
检查当前事务是否不存在或者是一个新事务
调用要执行的方法proceedWithInvocation
直接回滚doRollback
是否为REQUIRES_NEW
prepareTransactionStatus把当前事务管理器信息置空,并设置挂起数据连接信息资源
determineTransactionManager获取事务管理器
finally中执行使用 stack 恢复旧的事务 TransactionInfocleanupTransactionInfo()
判断是否有保存点
suspend()挂起空事务
TransactionSynchronizationUtils.triggerAfterCommit()
嵌套的 begin 和 commit/rollback 调用的嵌套事务
清除事务同步管理器中的所有同步。这是在事务完成后需要做的清理工作,以确保不会对后续的事务或操作产生影响。
triggerAfterCompletion触发 afterCompletion 回调
此事务对象的 ConnectionHolder清理
reactiveAdapterRegistry是否为空并且事务管理器为ReactiveTransactionManager
创建一个DataSourceTransactionObject对象txObjectDataSource 事务对象,表示 ConnectionHolder。被 DataSourceTransactionManager 用作事务对象
事务有保存点hasSavepoint
当前事务不是一个新的事务同步,但是同步对象列表不为空,说明当前事务可能是一个已经存在的事务的一部分
设置挂起事务为空
startTransaction开始新事务
执行方法后返回到proceedWithInvocation点
进行资源的解绑和连接的释放,以确保数据库连接能够被正确地归还到连接池中
结束本次事务调用
初始化事务连接信息prepareSynchronization
CglibAopProxy.intercept()动态代理执行进入
判断是否设置回滚标志
创建保存点信息status.createAndHoldSavepoint()
releaseHeldSavepoint释放为事务保留的 Savepoin
getTransactionAttribute根据属性信息获取事务类型
根据事务管理调用getTransaction处理传播行为
getTransactionAttributeSource返回 transaction 属性信息
获取 DataSource 实际使用对象并封装为ConnectionHolder对象并绑定到使用线程上
是否为NESTED
未捕获到异常信息
processCommit()处理实际提交。已检查并应用仅回滚标志
返回true,则表示当前事务是一个新的事务同步,需要进行后续的处理
doGetTransaction
是否为新资源持有者
cleanupTransactionInfo将挂起的事务重新设置回来
doCleanupAfterCompletion
是一个新事务,调用doCleanupAfterCompletion方法来执行事务完成后的清理工作。这通常包括关闭数据库连接、释放资源等操作。
是否有保存点信息
DelegatingTransactionAttribute给定的目标属性创建 DelegatingTransactionAttribute
判断标识是否存在
不是以全局方式调用 doCommit 已标记为仅回滚的事务并且全局事务本身已被事务协调器标记为仅回滚
0 条评论
下一页