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

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

本文介绍了事务提交过程中,具体执行提交任务的AbortTransaction函数详细执行流程。

1. 执行条件

存在三种调用此函数的场景:

  1. SQL语法出错,由sigsetjmp函数跳回PostgresMain函数,从AbortCurrentTransaction函数中调用AbortTransaction函数。
  2. 事务执行过程中出错,跳出执行AbortTransaction函数。
  3. 主动放弃事务,执行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();
  1. AtAbort_Memory()负责切换事务上下文到TransactionAbortContext,如果这个上下文没有足够的空间就切换到TopMemoryContext。
  2. 因为Abort的操作肯定是从top开始,AtAbort_ResourceOwner负责将TopTransactionResourceOwner切换到CurrentResourceOwner 。

释放所有LW锁,清除等待信息和命令进度指示器。

    LWLockReleaseAll();
    /* Clear wait information and command progress indicator */
    pgstat_report_wait_end();
    pgstat_progress_end_command();

事务在Abort之前可能会遇到各种需要等待的情况,这些等待可能是由于资源争用、锁、系统限制或其他原因造成的,因此:

  1. 调用LWLockReleaseAll()函数释放所有LW锁,需要释放LW锁;
  2. 调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值