リードコミッティド隔離レベル

Postgres がデフォルトとする隔離レベルは リードコミッティド です.この隔離レベルで トランザクションが実行される場合,問い合わせが注目するのは 問い合わせが開始される直前までにコミットされたデータのみであり, ダーティ・データも,問い合わせ処理実行中に同時に実行される トランザクションがコミットした変更の関与も一切ありません.

今,UPDATE(または DELETESELECT FOR UPDATE )文を実行している間に返された行を, 同時に実行されている,コミットされていないトランザクションが更新しようと しているとします.するとそのトランザクションは元のトランザクションが コミット,またはロールバックされるまで待ち状態に入ります. ロールバックがあった場合,待ち状態にあるトランザクションは行に 対する更新を実行します.一方,コミットされた場合(かつ,この 行がまだ存在している,すなわち他のトランザクションによって削除 されていない場合),この行に対して問い合わせをもう一度実行し, 新しい「行バージョン」が問い合わせ条件を満たすかどうか確認します. そして新しい行バージョンが条件を満たしていれば,行が更新されます (あるいは削除されるか,更新予定の印がつきます).

SELECT , (問い合わせつき)INSERT 文の結果は 同時に実行されているトランザクションの影響を受けません.