我在 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 的 UPDATE 可能是死锁的一部分?
谢谢