Postgres データベースに原因不明のデッドロックが発生しています。関連するクエリを単純化すると、デッドロックに関係するトランザクションの 1 つが次のようになります。
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;
もう1つは次のとおりです。
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 を使用する UPDATE はデッドロックの一部になる可能性がありますか?
ありがとう