spring事务
2023-01-24 23:21:38 0 举报
spring事务
作者其他创作
大纲/内容
triggerAfterCompletion
抛异常
suspend
handleExistingTransaction
TransactionInterceptor.invoke 若方法上加了Transactional则进入该逻辑
如果当前线程中所使用的DataSource还没有创建过数据库连接,就获取一个新的数据库连接且连接的newConnectionHolder属性为true
调用suspend方法将当前事务对象进行挂起,并返回suspendedResources对象
存在savepoint
持有
PROPAGATION_NEVER
doRollback(status);其实就是直接调用连接的rollback方法con.rollback();
如果是新开的事务、triggerAfterCompletion触发同步器的afterCompletion方法
否
doSuspend(transaction)挂起事务,把transaction中的Connection清空,并把resources中的key-value进行移除,并返回数据库连接Connection对象
doBegin开启事务
PROPAGATION_NESTED
TransactionSynchronizationSpring事务有可能会提交,回滚、挂起、恢复,所以Spring事务提供了一种机制,可以让程序员来监听当前Spring事务所处于的状态。
关闭数据库连接,清空resources
设置事务隔离级别、是否只读、事务名称,是否活跃TransactionSynchronizationManager.initSynchronization();往synchronizations加个空对象用于判断当前是否已经开启了事务(开启了synchronizations不为空ThreadLocal)
PROPAGATION_NOT_SUPPORTED
不持有
con.commit();
其他(PROPAGATION_SUPPORTS or PROPAGATION_REQUIRED)
当前执行的方法是新开了一个事务
将PlatformTransactionManager、TransactionAttribute、TransactionStatus、joinpointIdentification构造成一个TransactionInfo对象并返回
回滚到上一个savepoint位置
设置连接的autocommit为false
如果是新开的事务、triggerBeforeCompletion触发同步器的beforeCompletion方法
prepareSynchronization
doSuspendSynchronization1.调用同步器的挂起方法(suspend)2.清空synchronizations3.返回所有同步器
判断当前异常是否需要回滚(根据rollbackFor、norollbackFor判断,如果没有默认情况下为RuntimeException或Error会回滚
PROPAGATION_MANDATORY
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus())
TransactionSynchronizationManager.bindResource
如果是其他值则会在当前事务中运行
调用DataSourceTransactionManager中的doGetTransaction0根据当前datasource去名为TransactionSynchronizationManager。source的ThreadLocal去得到一个事务对象,得到的事务对象中可能持有也可能没有持有数据库连接对象且连接的newConnectionHolder属性为false
判断获得的事务对象中是查持有数据库连接对象isExistingTransaction(transaction)看前面这个步骤是事务是否获取到了连接对象
commitTransactionAfterReturning(txInfo);提交事务
构造DefaultTransactionStatus用来保持事务的定义、用来保存数据库连接的对象、是否是新事务,挂起资源等
getTransaction
根据挂起同步器、挂起连接资源、事务名称、是否可达、隔离级别、是否活跃构造一个挂起资源对象SuspendedResourcesHolder并返回
TransactionSynchronizationManager.isSynchronizationActive()当前是否有事务
判断传播机制
得到一个TransactionStatus
PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED
根据@Transactional注解中的设置,设置Connection的readOnly与隔离级别
if (!shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly())看当前连接是否需要回滚(一般出现场景为a方法调用b方法,b方法异常)
是
如果定义了超时时间的话、设置超时时间
判断超时时间是否<-1如果是抛异常
1、获取@Transactional注解中的属性值TransactionAttribute2、获取事务管理器PlatformTransactionManager(必须是这个类型)3、获取当前在执行的方法名字joinpointIdentification作为事务的名字
不是新开的事务
PROPAGATION_NOT_SUPPORTED如果当前存在事务,则把当前事务挂起,然后以非事务的方式运行
其他
invocation.proceedWithInvocation()执行业务方法
是否需要强制回滚可以通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();来设置
PROPAGATION_REQUIRES_NEW如果当前存在事务,则把当前事务挂起,然后新建一个事务运行
清空TransactionSynchronizationManager的事务名称(null)、是否可读(false)、隔离级别(null)、是否活跃(false)
SuspendedResourcesHolder suspendedResources = suspend(null); 直接会返回null
startTransaction
执行成功
triggerBeforeCompletion
如果font color=\"#323232\
triggerBeforeCommit
恢复被挂起的资源到当前线程中
如果本次开启事务当前线程第一次开启事务, 那么获得的事务对象中则没有数据库连接对象如果本次开启事务时当前线程中还有事务没有提交,那么获得的事务对象中就拥有数据库连接对象
0 条评论
下一页