暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

yidongyun1234 2024-08-21
54

海山数据库(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的研发。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论