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