一些数据库功能,例如 SELECT ... FOR UPDATE
和 ON DELETE CASCADE
, 隐含地容易受到死锁的影响,因为数据库没有指定将使用什么锁定顺序。我找到了 two discussions这暗示这种行为不是由 SQL 标准指定的,更不用说具体的实现了。因此,我假设我们无法控制锁定顺序(至少,如何做到这一点并不明显)。
如果我们不能依赖锁定顺序,我们应该如何避免数据库死锁?
如果我们不应该避免僵局(你将不得不非常努力地让我相信这一点),那么我们应该怎么做?
这个问题是与数据库无关的,所以请不要问我正在使用哪个数据库。
最佳答案
只是不要使用那些可能导致死锁的功能。 ON DELETE CASCADE
可以以强制顺序的方式重写,从而避免死锁。SELECT ... FOR UPDATE
专门设计用于避免锁定——它允许您选择和锁定一行,以便您可以在所有线程上保持一致的顺序。
你必须小心你如何使用它,如果你不了解所有更新的锁定顺序,它可能会导致死锁。
关于sql - 如何避免数据库死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131108/