如何避免数据库死锁?

问题描述 投票:4回答:2

某些数据库功能(如SELECT ... FOR UPDATEON DELETE CASCADE)隐式容易受到死锁的影响,因为数据库未指定将使用的锁定顺序。我发现two discussions暗示SQL标准没有指定这种行为,更不用说具体的实现了。因此,我在假设我们无法控制锁定顺序的情况下运行(至少,如何这样做并不明显)。

如果我们不能依赖锁定顺序,我们应该如何避免数据库死锁?

如果我们不应该避免死锁(你将不得不非常努力地说服我这一点)那么我们该怎么办呢?

这个问题是与数据库无关的,所以请不要问我正在使用哪个数据库。

sql select cascading-deletes database-deadlocks
2个回答
0
投票

只是不要使用那些可能导致死锁的功能。 ON DELETE CASCADE可以通过强制命令的方式重写,从而避免死锁。

SELECT ... FOR UPDATE专门设计为允许您避免锁定 - 它允许您选择并锁定行,以便您可以在所有线程上保持一致的顺序。

你必须要小心如何使用它,如果你不理解所有更新的锁定顺序,它可能会导致死锁。


-1
投票

几年后,我正在修改接受的答案,陈述database deadlocks cannot be prevented

如果您足够幸运能够将数据库操作分解为一次只与单个表进行交互(这种情况并非总是可行),那么您将被迫在性能不佳和死锁的可能性之间做出选择。选择你的毒药。

© www.soinside.com 2019 - 2024. All rights reserved.