PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

67.1. 事务与事务标识符 #

事务可以通过 BEGIN 或 START TRANSACTION 显式开启,并通过 COMMIT 或 ROLLBACK 终止。在显式事务块外部执行的独立 SQL 语句会自动作为单语句事务处理。

每个事务由唯一的虚拟事务 ID(VirtualTransactionId,亦称为 virtualXID 或 vxid)标识,它由后台进程编号(procNumber)和各后台进程本地递增的局部编号(localXID)组合而成。例如,虚拟事务 ID 4/12532 表示后台编号为 4、本地序号为 12532。

非虚拟事务 ID(TransactionId 或 xid,例如 278394)来自全集群所有数据库共享的全局递增计数器。仅当事务首次尝试向数据库执行写入操作时才会正式分配物理 xid。这意味着较小数值的 xid 必定比较大数值的 xid 更早开始执行写操作。请注意:事务首次执行写操作的时间顺序可能不同于事务本身的启动时间,尤其是在事务前期仅执行只读查询的场景下。

内核内部事务 ID 类型 xid 为 32 位整数,每隔约 40 亿个事务会发生一次回卷。在每次回卷时,32 位纪元(Epoch)计数器递增。系统同时提供了 64 位类型 xid8,它完整包含了该纪元值,因此在单个集群生命周期内永不回卷;xid8 可通过显式类型转换映射为 xid。Table 9.84 中的函数均返回 xid8 类型数值。事务 xid 是 PostgreSQL 构建 MVCC 多版本并发控制机制与流复制的物理基石。

当带有物理 xid 的顶层事务成功提交时,系统在 pg_xact 目录中将其状态原子标记为已提交。若启用了 track_commit_timestamp,相关的提交时间戳元数据还会同步持久化记录在 pg_commit_ts 目录中。

除 vxid 与 xid 外,已预备的分布式两阶段事务还会被分配全局事务标识符(GID)。GID 是最长 200 字节的字符串,在当前所有活跃预备事务之间必须全局唯一。GID 与物理 xid 的映射关系可通过系统视图 pg_prepared_xacts 查阅。