假设两个并发事务在 Postgresql DB 上执行以下查询:
交易A:
SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE
交易乙:
SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE
由于 Postgresql 以不一致的顺序获取行锁,是否可能发生死锁?例如,如果 Postgresql 以本例中给出的 id 顺序获取行锁,那么就有可能发生死锁。
或者 Postgresql 内部是否足够智能以始终SELECT FOR UPDATE
以同一表上的同时、离散语句不能相互死锁的方式获取行锁(例如,始终按主键的顺序获取行锁)?
如果 Postgresql不能自动防止这种死锁的发生,有没有办法修改查询来防止这种情况发生(例如,如果事实上 Postgresql 按照给定 id 的顺序获取行锁,那么一致地对 id 进行排序应该可以防止死锁)?
谢谢你的帮助!