1

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

我的问题是:

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

因此,会话在获取 B 上的锁定时失败,系统是否应该强制会话放弃会话所持有的其他资源,在这种情况下:A,并使会话无效?

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

4

3 回答 3

4

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

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

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

于 2010-07-07T15:15:04.080 回答
1

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

于 2010-07-07T14:53:12.453 回答
0

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

于 2010-07-07T14:46:45.947 回答