检测到死锁时应该怎么办?

时间:2010-07-07 14:42:41

标签: concurrency deadlock database-deadlocks

假设我想使用锁定系统实现数据库,并且我使用锁定避免并尝试在获取之前避免潜在的死锁。

我的问题是:

当会话/事务已成功获取某些资源A时,现在它会在检测到死锁时尝试获取资源B上的锁定。

因此,如果系统强制会话放弃会话所持有的其他资源,在这种情况下:A,并使会话无效,会话将无法获取B上的锁定。

或者还有其他更标准的方法来处理这种情况吗?

3 个答案:

答案 0 :(得分:4)

解决冲突(死锁)事务的常用方法是回滚其中一个事务并稍后重试(在另一个事务释放两个锁之后)。

但是如果事务是用某种编程语言打开的,那么数据库就无法从事务开始时重新运行所有代码;所以它能做的就是告诉应用程序存在死锁。应用程序开发人员必须编写代码以重试整个事务。

请注意,如果应用程序使用类似Software Transactional Memory的内容,则应用程序可以集成到数据库事务中并自动回滚应用程序状态并重试整个事务。

答案 1 :(得分:1)

SQL Server处理与您描述的方式类似的死锁 - 它将选择2个会话中的一个作为死锁受害者并终止/使会话无效。

答案 2 :(得分:0)

如果检测到死锁,则引发错误以指示程序员应该更改其模型。