アプリケーションにおけるデータ整合性のチェック

ところで,Postgres では どのようなトランザクションの隔離レベルが設定されていても,読み込み処理 に関してはデータのロックをしないので,あるトランザクションが読み込んだデータを, 他のトランザクションが書き換えてしまうことも起こり得ます. いいかえれば, SELECT 文で行が返されたとしても,それは 行が返された時点で(つまり,文あるいはトランザクション開始後のある時点で) その行が実際に存在していることを意味してはいませんし, また,このトランザクションがコミット/ロールバックされるまで,同時に 実行されているトランザクションによる削除や更新から保護されている,という ことでもないのです.

したがって, SELECT FOR UPDATE か,適切な LOCK TABLE 文を使用することで, 確実に行が存在するようにしておき,また同時に実行される他の更新から 行を保護します. このことは,シリアライザブルレベルを使ったアプリケーションを Postgres 以外の環境から, Postgres へとポーティングする際には考慮すべきです.

Note: バージョン 6.5 以前の Postgres は読み込み ロックを使用していたので,上記事項は以前のバージョンから, バージョン 6.5 (またはそれ以上)の Postgres に バージョンアップする場合にも適用されます.