PostgreSQL两阶段提交事务源码分析
源码版本:PG 13.3
PG 支持两阶段提交事务(2PC),本文基于 PG 13.3 源码,简单分析 2PC 事务处理相关的逻辑。
1. 两阶段事务提交的处理过程
2PC 各阶段的命令调用主要包含如下三个:
- prepare trancation xxx
- commit prepared xxx
- rollback prepared xxx
prepare transaction xxx 命令表示让名称为 xxx 的事务就绪,此时事务并不可见,其主要是调用如下两个函数:
- StartPrepare() 函数,把事务相关的数据全部存储到内存变量 static struct xllist records。
- EndPrepare() 函数,把 StartPrepare() 函数中保存到 records 变量中的数据写入 wal。
看一个例子,prepare transaction 'T200' 的调用堆栈:
exec_simple_query PortalRun PortalRunMulti PortalRunUtility ProcessUtility standard_ProcessUtility PrepareTransactionBlock //设置gid,此处为T200 finish_xact_command CommitTransactionCommand PrepareTransaction StartPrepare EndPrepare