PostgreSQL嵌套事务提交流程研究

探讨PostgreSQL中事务的嵌套特性,如何通过原子性操作确保事务及其子事务的一致性和可见性。深入分析TransactionIdSetTreeStatus方法,解释事务提交与回滚过程中的CLOG更新策略。

PostgreSQL嵌套事务提交流程研究

父事务最终提交代码流程图

在这里插入图片描述

事务提交调用流程

其中值得拿出来讲的,主要是TransactionIdSetTreeStatus这个方法。

这里涉及到一个概念,子事务。在PG这个地方,子事务的概念主要指:事务从开始到结束,期间可以

savepoint,之后rollback到savepoint而不是事务起点,在实际情况中多有应用,因此这里父事务与子事务(比如事务最终提交,但期间有回滚的情况,或者事务期间多次savepoint)必须尽可能原子性的方式写入,否则事务可见性就会出现问题。

在代码注释里面,对这里的写入做了一个比较直观的例子:

比如一个事务t,有子事务
t1,t2,t3,t4,其中t,t1被映射到clog页p1,t2和t3在p2,t4在页p3。那么写入的时候,顺序如下:

  • 设置p2 的t2 t3为子提交,之后设置p3的t4位子提交

  • 设置t1为子提交,之后设置t为已提交,之后设置t1为已提交

  • 设置 t2 t3 为已提交,设置t4位已提交

对于回滚,实际上也是调用TransactionIdSetTreeStatus方法,只是上层函数是TransactionIdAbortTree,设置的标记是TRANSACTIONSTATUSABORTED,也就是记录事务为中断。语义上来说,对于事务中断,由于事务的原子性要求,中断的事务数据就是不可见的了,没啥问题。

TransactionIdSetTreeStatus()讲解

代码注释

在提交日志中记录事务条目的最终状态

事务及其子事务树。注意确保这是

高效且尽可能原子。

xid是用于设置状态的单个xid。通常是

顶级提交或中止的顶级transactionid。它可以

当我们记录事务中止时,它也是子事务。

subxids是长度为nsubxids的xid数组,表示子事务

在xid树中。在各种情况下,nsubxids可以为零。

记录异步时,lsn必须是提交记录的WAL位置

提交。对于同步提交,它可以是I

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值