Postgresql

Postgres 單次更新會死鎖嗎

  • May 27, 2018

如果https://www.postgresql.org/docs/current/static/explicit-locking.html#LOCKING-DEADLOCKS中給出的兩個更新發生在一個UPDATE查詢中,它仍然會導致死鎖嗎?

事務 1 執行以下語句:

-- transaction 1
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum IN (11111, 22222);

事務 2 執行以下語句:

-- transaction 2; note the acctnum order is different
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum IN (22222, 11111);

請注意,acctnum查詢中提供的順序不同。請忽略帳戶餘額將不正確的事實。我對這種行為感興趣,因為我有類似的情況。

子句中值的順序in不重要。

可以按任何順序訪問行,此順序可以隨時更改。

然而,對於這麼少的目標集並且存在有序索引(不是雜湊索引),記錄可能會按索引順序訪問。

是的,這些語句可能會相互死鎖。

他們所屬的事務只有這一條指令這一事實並不能抑制死鎖的可能性。

錯誤的希望可能來自對**原子性**在指令級別提供的內容的樂觀解釋。UPDATE 不會在一次原子抓取中獲取多個行鎖:它必須一個一個地抓取它們,並且它們中的任何一個都有單獨的機會無法獲取。

問題的查詢來自https://www.postgresql.org/docs/current/static/explicit-locking.html上的文件,除了它顯示為兩個獨立的查詢處理單個acctnum. 當然,如果在同一個查詢中更新兩行解決了死鎖問題,文件會在這一點上提到它。它沒有提到它,因為它不是真的。

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