【问题标题】:Deadlock graph interpretation死锁图解释
【发布时间】:2018-07-25 16:40:24
【问题描述】:

我们有 SQL Server 2016。

我们遇到了这个死锁问题,我们不理解死锁图中的某些内容。

我们是这样解释的:

有问题的两个进程没有互相等待。尽管他们已经是该锁的所有者,但他们正在等待自己并尝试在同一资源上获取相同的锁。

我认为这种解释有些不对劲。
有知识渊博的人能解释一下这里发生了什么吗?
隔离级别为 READ_COMMITTED。

如果有人能在这里解释每一点,那将非常有帮助。

提前非常感谢。

【问题讨论】:

  • 在 XML 的第二部分中提供了有助于识别此处发生的情况的信息。我怀疑这两个锁位于索引的不同部分,并且(可能)两个锁都需要扩展 - 可能从行锁到页锁。此时,两个锁相互冲突,导致死锁。但是有了这个,我们不知道一个是否在事务中,或者是什么类型(可序列化、可重复等);如果它们都在同一个 SPID 上;以及许多其他有助于分析的信息。
  • 个人问题 - 如果您可以发布实际文字(而不是文字图片),它可以帮助人们极大地帮助您。
  • @Ben Thul 我知道。抱歉,我得到的只是一张照片。

标签: sql sql-server sql-server-2016


【解决方案1】:

当两个进程试图获取某个数据对象时会发生死锁,但只要另一个进程正在运行,每个进程都无法完成。 SQL Server 选择一个运行,一个作为受害者。

在您的图片中,似乎进程 8557c42ca8 对某物具有共享锁,而进程 d468 对某物具有独占锁。每个进程也是一个等待进程的服务员。因此,只要两个进程都不能继续,直到其中一个进程释放它们的锁,它们就处于无限循环中。

【讨论】:

  • 是的,但问题是那件事(他们试图锁定)不是同一件事吗?
  • @peter.petrov 可能不会。发布图形死锁图和整个 XML,您将获得更多信息
【解决方案2】:

有问题的两个进程没有相互等待。他们在等自己

没有。每个会话都拥有一把钥匙上的锁,并等待对方锁住的钥匙上的锁。

谁能解释一下这里发生了什么?

您需要发布死锁图的其余部分、表定义(包括索引)以及每个会话从其事务开始到死锁运行的代码。

【讨论】:

  • 是的,但问题是那件事(他们试图锁定)不是同一件事吗?
  • 没有。这两个锁都是钥匙锁,但在不同的钥匙上。在您的问题中发布完整的死锁 XML 以进行验证。键锁哈希打印在 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2021-10-03
  • 2014-05-28
相关资源
最近更新 更多