全部术语

多版本并发控制(MVCC)

PostgreSQL 中的 MVCC 是什么?

MVCC 让读和写可以同时进行:每条语句看到的是数据的一个快照,更新会写入新的行版本,而不是原地覆盖行。

多版本并发控制(MVCC)是 PostgreSQL 在不让并发事务相互等待的前提下保持其一致性的机制。每条语句看到的都是某个时间点的数据快照,因此读不会阻塞写,写也不会阻塞读。

在内部,UPDATE 会写入该行的一个新版本,并将旧版本标记为过期。隐藏的系统列 xmin 和 xmax 记录了每个版本由哪个事务创建、又由哪个事务使其过期。旧版本会一直留在表中,直到 VACUUM 将其清除,这也是运行时间很长的事务会导致表膨胀的原因。

示例

该示例在 UPDATE 前后分别读取隐藏的 xmin 列。该值发生了变化,因为更新写入了一个新的行版本,并打上了执行更新的事务的 ID。

CREATE TABLE accounts (id int PRIMARY KEY, balance int);
INSERT INTO accounts VALUES (1, 100);
SELECT xmin, xmax, * FROM accounts;

UPDATE accounts SET balance = 90 WHERE id = 1;
SELECT xmin, xmax, * FROM accounts;

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语