在 RDBMS 中如何检测和报告死锁?

Sha*_*caz 8 deadlock

我在面试中被问到了这篇论文类型的问题,但没有得到这份工作。完整的问题如下:

在 RDBMS 中如何检测和报告死锁?在检测和预防场景中,事务所有者和应用程序开发人员负责确保什么?

And*_*ren 13

在 SQL Server 中,有一个单独的线程会定期(默认为 5 秒,如果刚刚检测到死锁则间隔较低)检查任何周期的等待列表。即它标识线程正在等待的资源,然后它找到该资源的所有者并递归地找到该线程依次等待的资源,从而标识正在等待彼此资源的线程。

如果发现死锁,则选择使用以下算法杀死受害者:

  1. 识别不是不可杀死的线程(例如,回滚事务的线程是不可杀死的)。
  2. 找到死锁优先级最低的线程。
  3. 选择回滚成本最低的一个,即迄今为止完成最少工作的那个。

您可以在此处找到有关 SQL Server 死锁检测的更多信息:http : //msdn.microsoft.com/en-us/library/ms178104.aspx



事务所有者/应用程序开发人员负责将发生死锁的风险降到最低,并执行他们应该:

  1. 确保尽可能缩短交易时间。例如,在开始交易后不要显示登录表单并等待用户输入,而是收集您需要的所有信息,然后运行交易。
  2. 使用尽可能低的隔离级别,例如,当您只想暂时向用户显示某些值时不要设置可序列化。请注意,设置正确的隔离级别本身就是一门科学,超出了本答案的范围。
  3. 如果您是死锁的受害者,即您收到错误#1205,则重新对您的用户透明地运行您的事务。由于另一个竞争事务现在希望获得它正在等待并完成的资源,因此您不太可能再次遇到相同的死锁。

  • @ErikE“在整个应用程序中始终如一地以相同的顺序执行更新/删除/插入模式”通常是不可能/不可行的,尽管这个有问题的建议在网络上非常流行。详情请见:http://sqlblog.com/blogs/alexander_kuznetsov/archive/2010/01/15/when-acquiring-locks-in-the-same-order-is-not-possible-or-not-feasible.aspx (3认同)