spring事务之事务挂起和事务恢复源码

本文详细探讨了Spring事务管理中的挂起和恢复机制。通过实例解释了如何在PROPAGATION_REQUIRES_NEW传播级别下,挂起当前事务并创建新事务。挂起过程涉及suspend()方法保存事务信息,而恢复过程则是在事务提交或回滚时调用cleanupAfterCompletion()方法,使用resume()恢复事务状态。核心是利用SuspendedResourcesHolder对象存储和恢复事务属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习spring事务的时候,一定会涉及到一个概念,无法避免的,就是事务挂起和事务恢复
对于事务挂起和事务恢复,可以简单的描述一下,是这样的
1.首先我们假设有两个类,A类和B类,两个类中的字段是一模一样的,A类表示当前事务,B类表示备份事务
2.如果我开启一个事务,会把当前事务信息,存入到A类中,如果我这时候要进行事务挂起
3.事务挂起:就会把A类中当前事务的信息,赋值到B类中,然后在创建一个新事务的时候,会赋值到A类中
4.恢复事务:如果此时我当前事务执行完毕了,需要恢复原来的事务,就只需要将A类清空,然后将B类中的数据信息赋值到A类,此时A事务就会再次生效

我觉得可以理解为就是倒腾了一手

事务挂起源码

org.springframework.transaction.support.AbstractPlatformTransactionManager#handleExistingTransaction
我们直接跳入到这个方法中来看,这个方法是在当前事务存在的时候,会进入到这个方法来处理,执行链路是这样的
org.springframework.transaction.interceptor.TransactionInterceptor#invoke
	org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction
		org.springframework.transaction.interceptor.TransactionAspectSupport#createTransactionIfNecessary
			org.springframework.transaction.support.AbstractPlatformTransactionManager#getTransaction
				org.springframework.transaction.support.AbstractPlatformTransactionManager#handleExistingTransaction

正常的话,一个事务方法的执行是这个链路,自己debug看下即可,但是要进入到这个方法中,有一个前提,就是当前事务已存在,然后又调用了另外一个事务方法,才会进入到这里
我们以PROPAGATION_REQUIRES_NEW这个级别的传播机制为例,为什么以这个为例,因为这个传播机制,在当前事务存在的时候,是会将当前事务挂起,然后开启一个新的事务,也正好可以看下spring是如何挂起事务,并创建新事务的


if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {
   
   
	if (debugEnabled) {
   
   
		logger.debug("Suspending current transaction, creating new transaction with name [" +
				definition.getName
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值