2010-07-07 63 views
1

假设我想实现一个带有锁定系统的数据库,并且我使用锁定避免并在获取它之前尽量避免潜在的死锁。当检测到死锁时会发生什么

我的问题是:

当会话/事务已经成功地收购一些资源A,现在它试图获取对资源B的锁,检测到死锁时。

因此,如果系统强制会话放弃会话持有的其他资源(在本例中为A),并且使会话失效,会话将无法获得B上的锁定?

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

+3

“说我想实现一个数据库与锁系统” - 这是一个高难度的订单.... – 2010-07-07 14:46:01

+1

我实际上并没有这样做,不用担心^^ – Viele 2010-07-07 15:26:32

回答

4

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

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

请注意,如果应用程序正在使用诸如Software Transactional Memory之类的应用程序,则应用程序可能会集成到数据库事务中,并自动回滚应用程序状态并重试整个事务。

+0

嗨丹尼尔,你可以详细说明如何整合STM与数据库事务?我真的很感兴趣。 – Viele 2010-07-09 14:47:58

0

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

1

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