PostgreSQL(简称 PG)防止事务 ID 回卷(Transaction ID Wraparound)的核心机制是“冻结(Freeze)”机制,并依靠后台的 Autovacuum(自动清理) 进程强制执行。 要理解这个机制,我们需要从问题本身出发,逐步了解 PG 的解决方案。 --- 1. 为什么会发生回卷?(问题的本质) PostgreSQL 使用 MVCC(多版本并发控制) 来处理并发。每一行数据(Tuple)都有两个内部标记: :插入该行的事务 ID。 :删除/更新该行的事务 ID。 PG 的事务 ID(XID)是一个 32 位的无符号整数,最大值约为 42 亿($2^{32}$)。 PG 将这 42 亿个 ID 分为两半: 过去的 21 亿:被认为是旧事务(对其可见)。 未来的 21 亿:被认为是新事务(对其不可见)。 灾难场景:随着系统不断运行,XID 不断增加,当达到 42 亿上限后,它会回卷(Wrap around)重新变成 3(0、1、2 是保留 XID)。这时,原本非常老的数据(比如 XID=500 插入的数据),在新的 XID(比如 XID=3)看来,变...