文章目录
海山数据库(He3DB)源码详解:AbortTransaction函数
本文介绍了事务提交过程中,具体执行提交任务的AbortTransaction函数详细执行流程。
1. 执行条件
存在三种调用此函数的场景:
- SQL语法出错,由sigsetjmp函数跳回PostgresMain函数,从AbortCurrentTransaction函数中调用AbortTransaction函数。
- 事务执行过程中出错,跳出执行AbortTransaction函数。
- 主动放弃事务,执行AbortTransaction函数。
2. 执行过程
2.1 获取当前状态:
申请事务状态变量TransactionState s和并创建两个临时变量latestXid和is_parallel_worker。
将CurrentTransactionState变量赋值给TransactionState s。
TransactionState s = CurrentTransactionState;
TransactionId latestXid;
bool is_parallel_worker;
2.2 开始事务资源清理:
关闭中断开始清理工作。
/* Prevent cancel/die interrupt while cleaning up */
HOLD_INTERRUPTS();
切换事务上下文和资源拥有者。
/* Make sure we have a valid memory context and resource owner */
AtAbort_Memory();
AtAbort_ResourceOwner();
- AtAbort_Memory()负责切换事务上下文到TransactionAbortContext,如果这个上下文没有足够的空间就切换到TopMemoryContext。
- 因为Abort的操作肯定是从top开始,AtAbort_ResourceOwner负责将TopTransactionResourceOwner切换到CurrentResourceOwner 。
释放所有LW锁,清除等待信息和命令进度指示器。
LWLockReleaseAll();
/* Clear wait information and command progress indicator */
pgstat_report_wait_end();
pgstat_progress_end_command();
事务在Abort之前可能会遇到各种需要等待的情况,这些等待可能是由于资源争用、锁、系统限制或其他原因造成的,因此:
- 调用LWLockReleaseAll()函数释放所有LW锁,需要释放LW锁;
- 调用