某些数据库功能(例如SELECT ... FOR UPDATE和ON DELETE CASCADE)很容易受到死锁的影响,因为数据库未指定将使用哪种锁定顺序。我发现有两次 讨论暗示此行为不是SQL标准指定的,更不用说具体的实现了。因此,我在假设我们无法控制锁定顺序的情况下进行操作(至少,这样做并不明显)。
SELECT ... FOR UPDATE
ON DELETE CASCADE
如果我们不能依赖锁定顺序,应该如何避免数据库死锁?
如果我们不应该避免僵局(您将不得不非常努力地说服我),那么我们应该怎么做?
这个问题与数据库无关,所以请不要问我正在使用哪个数据库。
明智的做法是几年,我正在修改公认的答案,以声明无法防止数据库死锁。
如果您有幸能够分解数据库操作以一次仅与一个表进行交互(这种情况并非总是可能的),那么您将不得不在性能低下和出现死锁的可能性之间进行选择。选择你的毒药。