Я вижу некоторые необъяснимые тупики в нашей базе данных Postgres. Упрощая соответствующих запросов, один из сделок, участвующих в тупике является:Postgres deadlock
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;
Мой вопрос заключается в том, как это возможно, чтобы иметь тупиковую ситуацию здесь? Я не могу придумать ни одного сценария, когда первая транзакция может привести к тупиковой ситуации, независимо от того, какой другой запрос будет запущен одновременно.
Есть ли такой случай, то есть UPDATE с использованием вложенного SELECT ... FOR UPDATE может быть частью тупика?
Благодаря