應用層的數據完整性檢查

因為對 Postgres 的讀動作不會鎖定數據,不管事務是何隔離級別,一個事務讀取的數據可能被另一個事務覆蓋。換句話說,如果一條 SELECT 返回了一行,這並不意味著在返回該行時該行還存在(比如說在語句完成或事務開始後的某時)也不意味著在當前事務做提交或者回卷前該行被保護不被並行的事務刪除或更新。

要保証一行的實際存在和避免其被並行更新,我們必須使用 SELECT FOR UPDATE 或者合適的 LOCK TABLE 語句。當從其他環境向 Postgres 裡用可串行化模式移植應用時一定要把這些問題考慮進去。

注意: 在版本 6.5 前,Postgres 使用讀動作鎖,因而當從以前的 Postgres 版本向6.5(或更高版本)升級時也要考慮這些問題。