在postgres中使用“IN()”更新许多行时是否有可能出现死锁?

时间:2016-08-22 11:06:50

标签: sql postgresql

目前,我们使用以下语句同时更新许多行:

update my_table set field = 'value' where id in (<insert ids here>);

我担心的是,它可能会导致我们间隔运行的另一个查询出现死锁:

select my_table where field = 'value' for update order by id;

上面的查询将获取多行。

这种情况可能吗?

只是一点背景知识:

我们之前添加了id的顺序,因为当我们同时多次运行查询时,由于该查询的顺序不同,我们遇到了随机死锁。

我们想知道这是否也适用于更新语句。

1 个答案:

答案 0 :(得分:3)

是的,这些可能会陷入僵局。为避免这种情况,请在更新前立即在同一事务中运行select ... for update order by id。这将锁定所有受影响的行,并避免任何其他事务运行相同的select ... for update查询。

我不是说要巩固同样的两项任务。我说在两者中使用相同的锁定选择。