Postgresql
PostgreSQL 對目前事務中其他事務的記錄更改的可見性
我有一個表“tst”,它有一個“狀態”列,我們使用它來處理該表中的記錄。處理完記錄後,我們將狀態設置為“Y”;
#\d tst Table "core.tst" Column | Type | Modifiers --------+---------+----------- id | integer | not null status | text | Indexes: "amn2_pkey" PRIMARY KEY, btree (id)
問題:在長(大約 20 分鐘)事務開始時,我在 tst 表中有 3 條記錄,如下所示
#select * from tst; id | status ----+-------- 1 | N 2 | N 3 | N (3 rows)
但是在事務期間,我有幾條記錄被插入到 tst 表中,但我假設這些新記錄對目前事務不可見,但在測試中證明是錯誤的。
第 1 節:
DO $$ BEGIN perform pg_sleep(20) ; UPDATE amn2 SET des = 'Y' ; END $$;
第 2 節:
INSERT INTO tst VALUES ( 4, 'N');
發布會話 1,所有記錄都更新為狀態“Y”,包括 id 4。
這是預期的嗎?還是缺少一些數據庫/表可序列化設置?
我假設這些新記錄對目前事務不可見,但在測試中證明是錯誤的。
在預設
READ COMMITTED
隔離中情況並非如此。來自已送出事務的更改在事務中的下一條語句開始時變得可見。每個語句仍然有一個快照,因此您不能在語句中出現行。您可以使用
SERIALIZABLE
隔離來獲得這種行為,但它會對性能產生影響,並且可能導致快速變化的表上的表膨脹。請參閱有關事務隔離的文件以了解發生了什麼。