海山数据库(He3DB)源码详解:CleanupTransaction函数源码详解

海山数据库(He3DB)源码详解:CleanupTransaction函数

本文介绍了事务放弃过程中,释放资源并修改事务状态的函数CleanupTransaction执行流程。

执行条件

当时事务被放弃以后,代码执行完AbortTransaction函数,接着执行CleanupTransaction函数对事务尚未放弃的一些资源进行释放(例如:游标占有的资源,ResourceOwner等),并最终放弃事务,将事务状态转为初始状态DEFAULT。

执行过程

1. 获取当前状态

从全局变量中获取当前事务状态。

	TransactionState s = CurrentTransactionState;
	/* State should still be TRANS_ABORT from AbortTransaction(). */
	if (s->state != TRANS_ABORT)
		elog(FATAL, "CleanupTransaction: unexpected state %s",
			 TransStateAsString(s->state));

从全局变量CurrentTransactionState获取当前事务状态,并对当前事务状态进行判断,如果不是处在TRANS_ABORT,提交一条错误日志。

2. 释放占有资源

释放游标和快照占有的资源。

	AtCleanup_Portals();		/* now safe to release portal memory */
	AtEOXact_Snapshot(false, true); /* release the transaction's snapshots */
  1. AtCleanup_Portals()函数:负责清理游标所占用的资源。在AbortTransaction函数中,仅仅对游标的状态和要执行的操作进行了清理,并没有清理所占有的相关资源,在这里可以安全的释放所有占用的资源。
  2. AtEOXact_Snapshot():释放当前事务持有的所有事务快照,每个事务在开始时会创建一个快照,以便事务可以看到在事务开始时数据库的状态。当事务结束时,如果这些快照不再被需要,它们就会被释放,以减少系统资源的占用。

清理ResourceOwner相关的资源。

	CurrentResourceOwner = NULL;	/* and resource owner */
	if (TopTransactionResourceOwner)
		ResourceOwnerDelete(TopTransactionResourceOwner);
	s->curTransactionOwner = NULL;
	CurTransactionResourceOwner = NULL;
	TopTransactionResourceOwner = NULL;
  1. 如果TopTransactionResourceOwner存在,需要Delete并置为NULL;
  2. 将全局变量CurrentResourceOwner、CurTransactionResourceOwner和状态变量s->curTransactionOwner都置为NULL。

清理事务的上下文资源。

	AtCleanup_Memory();			/* and transaction memory */
  1. 上下文状态切换到TopMemoryContext;
  2. 根据当前TransactionAbortContext的状态,判断是否又子节点需要清理;
	/* 在AtCleanup_Memory()函数中 */
	if (TransactionAbortContext != NULL)
		MemoryContextResetAndDeleteChildren(TransactionAbortContext);
  1. 清理事务的上下文内存,包括TopTransactionContext、CurTransactionContext和CurrentTransactionState的curTransactionContext。

恢复事务的初始状态。

	s->fullTransactionId = InvalidFullTransactionId;
	s->subTransactionId = InvalidSubTransactionId;
	s->nestingLevel = 0;
	s->gucNestLevel = 0;
	s->childXids = NULL;
	s->nChildXids = 0;
	s->maxChildXids = 0;
	s->parallelModeLevel = 0;

	XactTopFullTransactionId = InvalidFullTransactionId;
	nParallelCurrentXids = 0;
  1. 将事务状态结构体中的属性恢复默认值;
  2. 将两个全局变量XactTopFullTransactionId和nParallelCurrentXids恢复默认值。

完成事务的Abort过程。

	/*
	 * done with abort processing, set current transaction state back to
	 * default
	 */
	s->state = TRANS_DEFAULT;

最后,将事务状态修改为DEFAULT,完成事务放弃的全部过程。因为事务已经在AbortTransaction函数中进行过日志记录操作,所以这里不需要再进行日志记录。

作者介绍

李超,移动云数据库工程师,负责云原生数据库He3DB的研发。
ransaction函数中进行过日志记录操作,所以这里不需要再进行日志记录。

作者介绍

李超,移动云数据库工程师,负责云原生数据库He3DB的研发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值