海山数据库(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 */
- AtCleanup_Portals()函数:负责清理游标所占用的资源。在AbortTransaction函数中,仅仅对游标的状态和要执行的操作进行了清理,并没有清理所占有的相关资源,在这里可以安全的释放所有占用的资源。
- AtEOXact_Snapshot():释放当前事务持有的所有事务快照,每个事务在开始时会创建一个快照,以便事务可以看到在事务开始时数据库的状态。当事务结束时,如果这些快照不再被需要,它们就会被释放,以减少系统资源的占用。
清理ResourceOwner相关的资源。
CurrentResourceOwner = NULL; /* and resource owner */
if (TopTransactionResourceOwner)
ResourceOwnerDelete(TopTransactionResourceOwner);
s->curTransactionOwner = NULL;
CurTransactionResourceOwner = NULL;
TopTransactionResourceOwner = NULL;
- 如果TopTransactionResourceOwner存在,需要Delete并置为NULL;
- 将全局变量CurrentResourceOwner、CurTransactionResourceOwner和状态变量s->curTransactionOwner都置为NULL。
清理事务的上下文资源。
AtCleanup_Memory(); /* and transaction memory */
- 上下文状态切换到TopMemoryContext;
- 根据当前TransactionAbortContext的状态,判断是否又子节点需要清理;
/* 在AtCleanup_Memory()函数中 */
if (TransactionAbortContext != NULL)
MemoryContextResetAndDeleteChildren(TransactionAbortContext);
- 清理事务的上下文内存,包括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;
- 将事务状态结构体中的属性恢复默认值;
- 将两个全局变量XactTopFullTransactionId和nParallelCurrentXids恢复默认值。
完成事务的Abort过程。
/*
* done with abort processing, set current transaction state back to
* default
*/
s->state = TRANS_DEFAULT;
最后,将事务状态修改为DEFAULT,完成事务放弃的全部过程。因为事务已经在AbortTransaction函数中进行过日志记录操作,所以这里不需要再进行日志记录。
作者介绍
李超,移动云数据库工程师,负责云原生数据库He3DB的研发。
ransaction函数中进行过日志记录操作,所以这里不需要再进行日志记录。
作者介绍
李超,移动云数据库工程师,负责云原生数据库He3DB的研发。