sql - 如何避免数据库死锁?

标签 sql select cascading-deletes database-deadlocks

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

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

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

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

最佳答案

只是不要使用那些可能导致死锁的功能。 ON DELETE CASCADE可以以强制顺序的方式重写,从而避免死锁。
SELECT ... FOR UPDATE专门设计用于避免锁定——它允许您选择和锁定一行,以便您可以在所有线程上保持一致的顺序。

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

关于sql - 如何避免数据库死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131108/

相关文章:

php - 使用事件记录根据其他表中包含与外键相同的 id 的每个 id 计算行数

css - 如何让我的文本包裹在我的 dijit.form.select 中

MySQL - 基于同一表中的行求和列值

oracle - 授予选择,插入,更新表空间的权限

c# - Entity Framework 级联删除问题-外键设置为空

c# - EntityFramework 和级联删除

java - DB4O 递归删除,它实际上是如何工作的?

sql - 如何自动更改月份输入

SQL 计数。当其他两列匹配时,如何计算表中有多少个不同值?

mysql - SQL : loop through same table