【发布时间】:2013-01-02 23:53:08
【问题描述】:
某些数据库功能,例如SELECT ... FOR UPDATE 和ON DELETE CASCADE,由于数据库没有指定将使用什么锁定顺序,因此隐含地容易发生死锁。我发现 two discussions 暗示 SQL 标准没有指定这种行为,更不用说具体的实现了。因此,我是在我们无法控制锁定顺序的假设下进行操作的(至少,如何做到这一点并不明显)。
如果我们不能依赖锁定顺序,我们应该如何避免数据库死锁?
如果我们不应该避免僵局(你将不得不非常努力地说服我相信这一点)那么我们应该怎么做?
这个问题与数据库无关,所以请不要问我使用的是哪个数据库。
【问题讨论】:
-
死锁是由应用程序的故障引起的。您只需要整理您的应用程序并正确使用数据库。不要试图“滚动你自己的”并发控制——把它留给数据库。这是关于 Oracle 解除锁定处理的一个有趣的 AskTom 问题。 asktom.oracle.com/pls/asktom/…
-
我想说的是:您不需要知道“级联删除”使用什么锁定顺序。 DBMS 在删除和级联期间负责锁定和并发,如果需要取消事务/回滚。就您而言,删除和级联是原子操作。
-
@LordPeter,我的目标是编写一个保证运行没有死锁的应用程序。我没有看到数据库保证不会发生死锁的迹象,而如果我推出自己的并发控制,我可以做出这样的保证。回滚事务是不可接受的;一开始就不应该出现死锁。
-
我没有正确传达这个问题。死锁按定义是一个应用程序错误,DBMS 将通过狙击/杀死其中一个死锁会话来解决该错误。只有当应用程序有问题时才会发生死锁。如果必须的话,可以使用自己的并发控制,但微软、甲骨文、IBM 和一大群 OSS 人员几十年来一直在改进他们的并发控制 - 使用他们为您构建的东西!
-
@LordPeter,如果应用程序控制建立锁的顺序,死锁只能是应用程序错误。要么提供我可以预期的锁定顺序的解释,要么提供一个有问题的应用程序行为的示例,以便我知道应该避免什么。
标签: sql select cascading-deletes database-deadlocks