9.3. リードコミッティド(コミットされた読み込み)隔離レベル

Postgresでは、リードコミッティドが デフォルトの隔離レベルに設定されています。トランザクションがこのレベルで 実行された場合、SELECT文はこの問い合わせが開始される直前までに コミットされたデータのみであり、コミットされていないデータや、このトランザクションと 同時に実行されてデータが変更になったものなどは参照しません。 (しかし、コミットされていないものでも、同じトランザクションで行われた更新の結果は 参照します)。したがって、SELECT文を同じ1つのトランザクションで 2回連続実行したとき、もし他のトランザクションが1つ目のSELECT文の最中に 変更がコミットされたら、違う結果を返すことにご注意ください。

UPDATE文やDELETE文、 SELECT FOR UPDATE文を実行しようとした際、 その条件に該当する列が同時に実行されている別のトランザクションによって すでに更新されていて、しかしまだコミットされていない場合は、 後の方のトランザクションは、前のトランザクションがコミットされるか ロールバックされるまで待ちます。ロールバックの 後のトランザクションは列を更新することができます。 前の実行がコミットされ、(なおかつその列がまだ存在する場合、 すなわち他のトランザクションによって削除されなかった場合) 問い合わせはこの行に対して問い合わせをもう一度実行し、 「新しい行」が問い合わせ条件を満たすかどうか確認します。 「新しい行」が問い合わせの条件を満たす場合、その行は更新されます。 (あるいは削除されるか更新マークが付けられます) 「新しい行」のバージョンが今後の更新の対象となります。さらに、その後、 二重に更新された行は、同じトランザクションでのSELECTで 最新の情報が表示されます。したがって、現在のトランザクションでも 別のトランザクションがある特定の行に対して行った更新も表示されます。

リードコミッティドレベルで提供されている部分的なトランザクション隔離は 多くののアプリケーションにとって十分なもので、このレベルは高速で使用も容易です。 しかし、複雑な問い合わせや更新を行うアプリケーションでは リードコミッティド隔離レベルで提供される以上にデータベースに対して厳密に 一貫性のある見え方を保障する必要があるかもしれません。