2017-05-25 51 views
4

有沒有什麼條件下使用典型自動增量字段在表中創建的記錄可用於讀序列?PostgreSQL自動增加競爭條件是否可能

例如,當值爲9的記錄對於選擇查詢還不可見時,選擇查詢的結果中是否會出現值爲10的記錄?

我的問題的目的是...我想知道如果使用從一個查詢中檢索到的最大值作爲下限來確定以後未查詢的值,或者可能會錯過一行,是否可靠?

如果這種競爭條件在某些情況下是可能的,那麼是否有任何隔離級別可以用於對這個問題不產生影響的選擇查詢?

回答

3

是的,對你的思考很好。

你可以平凡三個並行的psql會話證明這一點,給出了一些表

CREATE TABLE x (
    seq serial primary key, 
    n integer not null 
); 

然後

SESSION 1     SESSION 2      SESSION 3 
BEGIN;  
          BEGIN; 
INSERT INTO x(n) VALUES(1) 
          INSERT INTO x(n) VALUES (2); 
          COMMIT; 
                  SELECT * FROM x; 
COMMIT; 
                  SELECT * FROM x; 

安全的假設,對於任何產生的價值n,所有產生的已由已提交或已中止的xacts使用的值爲n-1。在您看到n後,它們可能正在進行中並進行提交。

我不認爲隔離水平真的幫助你在這裏。 SERIALIZABLE沒有相互依賴性檢測。

這部分是爲什麼添加了邏輯解碼的原因,因此您可以按提交順序獲得一致的流。