openGauss源码解析(71)
openGauss源码解析:事务机制源码解析(3)
4. 事务状态转换相关函数简述
1) 事务处理子函数:根据当前事务上层状态机,对事务的资源进行相应的申请、回收及清理。
具体介绍如表5-2所示。
表5-2 事务处理子函数
子函数 |
说明 |
---|---|
StartTransaction |
开启事务,对内存及变量进行初始化操作,完成后将底层事务状态置为TRANS_INPROGRESS |
CommitTransaction |
当前的底层状态机为TRANS_INPROGRESS,然后置为TRANS_COMMIT,本地持久化CLOG及XLOG日志,并清空相应的事务槽位信息,最后将底层状态机置为TRANS_DEFAULT |
PrepareTransaction |
当前底层状态机为TRANS_INPROGRESS,同前面描述的CommitTransaction函数类似处理,设置底层状态机为TRANS_PREPARE,构造两阶段GXACT结构并创建两阶段文件,加入dummy的槽位信息,将线程的锁信息转移到dummy槽位中,释放资源,最后将底层状态机置为TRANS_DEFAULT |
AbortTransaction |
释放LWLock、UnlockBuffers、LockErrorCleanup,当前底层状态为TRANS_INPROGRESS,设置为TRANS_ABORT,记录相应的CLOG日志,清空事务槽位信息,释放各类资源 |
CleanupTransaction |
当前底层状态机应为TRANS_ABORT,继续清理一些资源,一般紧接着AbortTransaction调用 |
FinishPreparedTransaction |
结束两阶段提交事务 |
StartSubTransaction |
开启子事务 |
CommitSubTransaction |
提交子事务 |
AbortSubTransaction |
回滚子事务 |
CleanupSubTransaction |
清理子事务的一些资源信息,类似于CleanupTransaction |
PushTransaction/PopTransaction |
子事务类似于一个栈式的信息,Push/Pop函数是开启和结束子事务时使用 |
2) 处理函数,根据相应的状态机调用子函数。
具体介绍如表5-3所示。
表5-3 事务执行函数
函数 |
说明 |
---|---|
StartTransactionCommand |
事务开始时根据上层状态机调用相应的事务执行函数 |
CommitTransactionCommand |
事务结束时根据上层状态机调用相应的事务执行函数 |
AbortCurrentTransaction |
事务内部出错,长跳转longjump调用,提前清理掉相应的资源,并将事务上层状态机置为TBLOCK_ABORT |
3) 上层事务状态机控制函数
具体介绍如表5-4所示。
表5-4 上层事务状态机控制函数
函数 |
说明 |
---|---|
BeginTransactionBlock |
开启一个显式事务时,将上层事务状态机变为TBLOCK_BEGIN |
EndTransactionBlock |
显式提交一个事务时,将上层事务状态机变为TBLOCK_END |
UserAbortTransactionBlock |
显式回滚一个事务时,将上层事务状态机变为TBLOCK_ABORT_PENDING/ TBLOCK_ABORT_END |
PrepareTransactionBlock |
显式执行PREPARE语句,将上层事务状态机变为TBLOCK_PREPARE |
DefineSavepoint |
执行savepoint语句,通过调用PushTransaction将子事务上层事务状态机变为TBLOCK_SUBBEGIN |
ReleaseSavepoint |
执行release savepoint语句,将子事务上层状态机转变为TBLOCK_SUBRELEASE |
RollbackToSavepoint |
执行“rollback to”语句,将所有子事务上层状态机转变为TBLOCK_SUBABORT_PENDING/ TBLOCK_SUBABORT_END,顶层事务的上层状态机转变为TBLOCK_SUBABORT_RESTART |