マルチバージョン同時実行制御(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 公式ドキュメント(英語)。