在同一个表中的两个“SELECT FOR UPDATE”语句可能导致死锁?(Can two “SEL

2019-08-01 08:03发布

假设两个并发事务执行上一个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应该防止死锁)?

谢谢你的帮助!

Answer 1:

对不起,我有另外的答案,但它是错误的。

该文件指出,一个ORDER BY子句FOR UPDATE子句之前应用。 所以锁被以任何顺序选择的行获得的(我已经通过试验证实这样的)。 如果您需要以不同的顺序来选择他们,你可以使用:

SELECT * FROM (SELECT * FROM table ORDER BY id FOR UPDATE) ORDER BY another_column;

你可能想试试你的PostgreSQL的问题上的邮件列表 。



Answer 2:

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

PostgreSQL自动侦测到死锁情况,并通过中止参与交易的一个解决他们

该网页使用涉及一个例子UPDATE s,这相当于SELECT ... FOR UPDATE相对于锁定。



文章来源: Can two “SELECT FOR UPDATE” statements on the same table cause a deadlock?