目前,我们使用以下语句同时更新许多行:
update my_table set field = 'value' where id in (<insert ids here>);
我担心的是,它可能会导致我们间隔运行的另一个查询出现死锁:
select my_table where field = 'value' for update order by id;
上面的查询将获取多行。
这种情况可能吗?
只是一点背景知识:
我们之前添加了id的顺序,因为当我们同时多次运行查询时,由于该查询的顺序不同,我们遇到了随机死锁。
我们想知道这是否也适用于更新语句。
答案 0 :(得分:3)
是的,这些可能会陷入僵局。为避免这种情况,请在更新前立即在同一事务中运行select ... for update order by id
。这将锁定所有受影响的行,并避免任何其他事务运行相同的select ... for update
查询。
我不是说要巩固同样的两项任务。我说在两者中使用相同的锁定选择。