假设两个并发事务在 Postgresql DB 上执行以下查询:
交易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
同一个表上的语句不能彼此死锁(例如,始终按主键的顺序获取行锁)?
如果 PostgreSQLdoesn't自动防止这种死锁的发生,有没有办法修改查询来防止这种情况(例如,如果事实上 Postgresql 按照给定 id 的顺序获取行锁,那么一致地对 id 进行排序应该可以防止死锁)?
谢谢你的帮助!
抱歉,我有另一个答案,但它是错误的。
文档指出 ORDER BY 子句在 FOR UPDATE 子句之前应用。因此,无论选择行的顺序如何,都会获取锁(我已通过测试确认了这一点)。如果您需要以不同的顺序选择它们,您可以使用:
SELECT * FROM (SELECT * FROM table ORDER BY id FOR UPDATE) ORDER BY another_column;
您可能想在 PostgreSQL 上尝试您的问题邮件列表 http://archives.postgresql.org/pgsql-general/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)