我在Postgres數據庫中看到了一些無法解釋的死鎖。簡化相關查詢,死鎖涉及的交易之一是:Postgres死鎖
BEGIN;
UPDATE A SET CHUNK_ID=1, STATUS='PROCESSING' WHERE ID IN (
SELECT ID FROM A
WHERE CHUNK_ID IS NULL
ORDER BY O_ID
LIMIT 1000
FOR UPDATE
);
COMMIT;
,另一種是:
BEGIN;
UPDATE A SET STATUS='SENT' WHERE ID = 1;
UPDATE A SET STATUS='SENT' WHERE ID = 2;
UPDATE A SET STATUS='SENT' WHERE ID = 3;
...
COMMIT;
我的問題是怎麼可能有一個僵局嗎?我無法想象第一個事務可能導致死鎖的任何場景,而不管同時運行任何其他查詢。
是否有這樣的情況下,即使用一個嵌套的SELECT ... FOR UPDATE可以是僵局的部分更新?
感謝