トランザクション分離レベル
PostgreSQL のトランザクション分離レベルとは?
分離レベルは、同時実行中の他のトランザクションによる変更を、あるトランザクションがどこまで参照できるかを決めます。PostgreSQL のデフォルトは Read Committed で、Repeatable Read と Serializable も利用できます。
SQL 標準では、許容する異常現象(ダーティリード、ノンリピータブルリード、ファントムリード、直列化異常)に応じて 4 つの分離レベルを定義しています。PostgreSQL は 4 つのレベル名をすべて受け付けますが、Read Uncommitted は Read Committed と同じ動作をするため、実質的には Read Committed、Repeatable Read、Serializable の 3 つです。
デフォルトの Read Committed では文ごとに新しいスナップショットが使われるため、同じトランザクション内の 2 つのクエリが異なるデータを参照することがあります。Repeatable Read はトランザクション全体で 1 つのスナップショットを使います。Serializable はさらにチェックを加え、同時実行されるトランザクションが 1 つずつ順番に実行されたかのように振る舞うようにします。より厳格な 2 つのレベルでは、トランザクションが直列化エラーで失敗することがあり、アプリケーションはそれを再試行する必要があります。
例
この例では、サーバーのデフォルトのレベルを表示し、Repeatable Read のトランザクションを開始して SHOW transaction_isolation で確認します。そのトランザクション内のすべての読み取りは同じスナップショットを使います。
CREATE TABLE stock (sku text PRIMARY KEY, qty int);
INSERT INTO stock VALUES ('A-1', 5);
SHOW default_transaction_isolation;
BEGIN ISOLATION LEVEL REPEATABLE READ;
SHOW transaction_isolation;
SELECT qty FROM stock WHERE sku = 'A-1';
COMMIT;拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。