4

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

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

如果我们不应该避免僵局(你将不得不非常努力地说服我相信这一点)那么我们应该做什么?

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

4

2 回答 2

0

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

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

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

于 2013-01-15T03:31:02.333 回答
-1

几年后,我正在修改公认的答案,指出无法防止数据库死锁

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

于 2017-12-31T11:51:20.447 回答