某些数据库特性(如SELECT ... FOR UPDATE和ON DELETE CASCADE )隐式易受死锁的影响,因为数据库没有指定将使用何种锁定顺序。我发现二 讨论暗示这种行为不是由SQL标准指定的,更不用说具体的实现了。因此,我的操作假设是我们无法控制锁定顺序(至少,如何做到这一点并不明显)。
如果我们不能依赖锁顺序,我们应该如何避免数据库死锁?
如果我们不应该避免死锁(为了让我相信这一点,你必须非常努力地战斗),那我们该怎么办?
这个问题是数据库无关的,所以请不要问我使用的是哪个数据库。
发布于 2017-12-31 11:51:20
再过几年,我正在修改公认的答案,声明无法防止数据库死锁。。
如果您足够幸运地能够分解数据库操作,一次只能与单个表交互(这并不总是可能的),那么您就不得不在性能差和死锁的可能性之间做出选择。挑出你的毒药。
发布于 2013-01-15 03:31:02
只是不要使用那些可能导致死锁的特性。ON DELETE CASCADE可以以强制命令的方式重新编写,从而避免死锁。
SELECT ... FOR UPDATE是专门为避免锁而设计的--它允许您选择并锁定一行,这样您就可以在所有线程上保持一致的顺序。
您确实需要小心使用它,如果您不了解所有更新的锁定顺序,它可能会导致死锁。
https://stackoverflow.com/questions/14131108
复制相似问题