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

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

被折叠的 条评论
为什么被折叠?



