同一个表上的两个"SELECT FOR UPDATE"语句会导致死锁吗?

Ste*_*e A 12 postgresql database-deadlocks rails-postgresql

假设两个并发事务在Postgresql DB上执行以下查询:

交易A:

SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE
Run Code Online (Sandbox Code Playgroud)

交易B:

SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE
Run Code Online (Sandbox Code Playgroud)

由于Postgresql以不一致的顺序获取行锁,是否可能发生死锁?例如,如果Postgresql按照此示例中给出的id的顺序获取行锁,则可能存在死锁.

或者Postgresql内部是否足够智能,以便始终SELECT FOR UPDATE以同一个表上的同时离散语句不会相互死锁的方式获取行锁(例如,始终按主键顺序获取行锁)?

如果PostgreSQL的自动防止此类死锁的发生,是否有修改,以防止这种情况的查询方式(例如,如果事实上PostgreSQL的收购顺序行锁被赋予的标识,并始终如一地分拣ID应该防止死锁)?

谢谢你的帮助!

j_r*_*ker 0

来自http://www.postgresql.org/docs/9.1/static/explicit-locking.html

PostgreSQL 自动检测死锁情况并通过中止所涉及的事务之一来解决它们

该页面使用了一个涉及UPDATEs 的示例,这相当于SELECT ... FOR UPDATE锁定。