Postgresql

PostgreSQL 對目前事務中其他事務的記錄更改的可見性

  • July 21, 2015

我有一個表“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隔離來獲得這種行為,但它會對性能產生影響,並且可能導致快速變化的表上的表膨脹。

請參閱有關事務隔離的文件以了解發生了什麼。

引用自:https://dba.stackexchange.com/questions/107598