如何避免数据库死锁?

时间:2013-01-02 23:53:09

标签: sql select cascading-deletes database-deadlocks

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

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

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

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

2 个答案:

答案 0 :(得分:0)

请勿使用可能导致死锁的功能。 ON DELETE CASCADE可以以强制命令的方式重写,从而避免死锁。

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

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

答案 1 :(得分:-1)

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

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