假设两个并发事务执行上一个PostgreSQL数据库以下查询:
事务A:
SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE
事务B:
SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE
是否有可能死锁发生,因为到PostgreSQL不一致的订单获取行锁? 例如,如果PostgreSQL的是获得行锁的ID在这个例子中给定的顺序,再有就是死锁的可能性。
或者是PostgreSQL的内部足够的智能,始终获得行锁的方式,同时,离散的SELECT FOR UPDATE
语句对同一个表不能死锁对方(例如,通过收购总是行锁在主键的顺序)?
如果PostgreSQL 并不自动地防止这种死锁的发生,是否有修改,以防止这种情况的查询方式(例如,如果事实上PostgreSQL的收购顺序行锁被赋予的标识,并始终如一地分拣ID应该防止死锁)?
谢谢你的帮助!