他のバージョンの文書10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

PostgreSQLでは、Read Committed がデフォルトの隔離レベルに設定されています。トランザクションがこのレベルで実行された場合、SELECT文はこの問い合わせが開始される直前までにコミットされたデータのみを参照し、コミットされていないデータや、このトランザクションと同時に実行されたトランザクションで実行された問い合わせでコミットされた変更などは参照しません(しかし、コミットされていないものでも、同じトランザクション内で行われた更新の結果は参照します)。単一のトランザクション内であってもSELECT文を2回連続して発行した場合、最初のSELECT文を処理している最中に他のトランザクションが更新をコミットしたとすると、2回のそれぞれのSELECT文はことなるデータを参照することに注意して下さい。

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

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