Postgresql
Postgres 單次更新會死鎖嗎
如果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
. 當然,如果在同一個查詢中更新兩行解決了死鎖問題,文件會在這一點上提到它。它沒有提到它,因為它不是真的。