gpt4 book ai didi

postgresql - 同一张表上的两条 "SELECT FOR UPDATE"语句会导致死锁吗?

转载 作者:行者123 更新时间:2023-11-29 11:14:15 32 4
gpt4 key购买 nike

假设两个同时发生的事务在 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 的顺序获取行锁给出,然后一致地对 ID 进行排序应该可以防止死锁)?

感谢您的帮助!

最佳答案

抱歉,我有另一个答案,但它错了。

文档指出在 FOR UPDATE 子句之前应用 ORDER BY 子句。因此,无论选择行的顺序如何,都会获取锁(我已经通过测试确认了这一点)。如果您需要以不同的顺序选择它们,您可以使用:

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

您可能想在 PostgreSQL mailing list 上尝试您的问题.

关于postgresql - 同一张表上的两条 "SELECT FOR UPDATE"语句会导致死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825663/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com