spring事务原理三【事务回滚】

@Override
	public final void rollback(TransactionStatus status) throws TransactionException {
	//事务已完成则抛异常
	//事务不能重复回滚和提交
		if (status.isCompleted()) {
			throw new IllegalTransactionStateException(
					"Transaction is already completed - do not call commit or rollback more than once per transaction");
		}
  
		DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status;
		//回滚
		processRollback(defStatus, false);
	}
private void processRollback(DefaultTransactionStatus status, boolean unexpected) {
		try {
		//false
			boolean unexpectedRollback = unexpected;

			try {
			//异步处理
			//忽略
				triggerBeforeCompletion(status);
            //是否有保存点
            //回滚到保存点
				if (status.hasSavepoint()) {
					if (status.isDebug()) {
						logger.debug("Rolling back transaction to savepoint");
					}
					status.rollbackToHeldSavepoint();
				}
				//是否是新事务
				else if (status.isNewTransaction()) {
					if (status.isDebug()) {
						logger.debug("Initiating transaction rollback");
					}
					//真正回滚
					//Connector.rollback
					//下文贴代码
					doRollback(status);
				}
					//如果不是新事务
				else {
				
					//是否有事务
					if (status.hasTransaction()) {
					//GlobalRollbackOnParticipationFailure默认为true
					
						if (status.isLocalRollbackOnly() || isGlobalRollbackOnParticipationFailure()) {
							//设置LocalRollbackOnly为true,标记回滚
							//没有实际回滚
							doSetRollbackOnly(status);
						}
						else {
							if (status.isDebug()) {
								logger.debug("");
							}
						}
					}
					else {
						logger.debug("");
					}
					
					if (!isFailEarlyOnGlobalRollbackOnly()) {
						unexpectedRollback = false;
					}
				}
			}
			catch (RuntimeException | Error ex) {
				triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN);
				throw ex;
			}

			triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK);

			// Raise UnexpectedRollbackException if we had a global rollback-only marker
			if (unexpectedRollback) {
				throw new UnexpectedRollbackException(
						"Transaction rolled back because it has been marked as rollback-only");
			}
		}
		finally {
		//清除事务
		//如果有旧事务,则重新使用旧事务
			cleanupAfterCompletion(status);
		}
	}

	private void cleanupAfterCompletion(DefaultTransactionStatus status) {
	
		status.setCompleted();
		if (status.isNewSynchronization()) {
			TransactionSynchronizationManager.clear();
		}
		//清除事务
		if (status.isNewTransaction()) {
			doCleanupAfterCompletion(status.getTransaction());
		}
		if (status.getSuspendedResources() != null) {
			if (status.isDebug()) {
				logger.debug("");
			}
			Object transaction = (status.hasTransaction() ? status.getTransaction() : null);
			//取消挂起
			resume(transaction, (SuspendedResourcesHolder) status.getSuspendedResources());
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事务回滚原理是基于ACID特性和@Transactional注解的机制。当在执行某个方法时,如果方法中有包含对数据库的插入或者更新操作,并且在当前事务上下文抛出了异常,Spring会对已经进行的数据库操作进行回滚,恢复到原来的状态。\[1\] 使用Spring事务管理功能后,Spring会在启动时解析生成相关的bean,并查看拥有@Transactional注解的类和方法。然后为这些类和方法生成代理,并根据@Transactional的相关参数使用动态代理进行相关配置注入。这样,在代理中就会自动处理事务(开启正常提交事务,异常回滚事务)。\[2\] 需要注意的是,@Transactional注解可以作用于接口、接口方法、类以及类方法上。当作用于类时,该类的所有public方法都将具有事务的特性。但是Spring建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时才会生效。另外,@Transactional注解只能应用到public方法上,作用于protected、private时,会被忽略,也不会抛出任何异常,这是由Spring AOP的本质决定的。\[3\] #### 引用[.reference_title] - *1* *3* [Spring 事务回滚原理和方法](https://blog.csdn.net/weixin_44201216/article/details/97397530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [spring事务回滚机制,事务原理](https://blog.csdn.net/qq_45076180/article/details/106496486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值