Exchangevent 在 SQL 死锁图中表示什么?

use*_*632 2 sql-server sql-server-2014 deadlock-graph

有一个死锁 XDL 文件,其中列出了几个交换事件。不确定这些是好是坏,或者是什么导致了它们。是什么导致 SQL 死锁图中的交换事件?

 <exchangeEvent id="Pipe12dfb4bc900" WaitType="e_waitPipeGetRow" nodeId="28">
   <owner-list>
    <owner id="process4a9ee4eca8" />
   </owner-list>
   <waiter-list>
    <waiter id="process2612ca8" />
 </waiter-list>
  </exchangeEvent>
Run Code Online (Sandbox Code Playgroud)

J.D*_*.D. 5

Exchange Events提供有关死锁本身的详细信息和上下文。具体地,WaitType e_waitPipeGetRow是一种资源,一个SELECT语句拥有和另一SELECT语句等待,麦角被阻止由所述第一SELECT(例如,由于资源争用)。这个StackOverflow 答案提供了更多关于它的上下文和具体的死锁。

我不是阅读死锁图数据的专家,但我的研究似乎表明这种死锁WaitType可能与查询内并行死锁有关(如之前链接的 StackOverflow 答案中所述)。

您可能会发现 SentryOne 对死锁的更高级别阅读有助于理解正在发生的事情。

  • 请注意,死锁图中存在查询内并行等待并不总是意味着它是“查询内并行线程死锁”。并行查询的一个线程可能与另一个会话发生普通死锁,并且并行查询中的其他线程被阻塞并出现在死锁图中。 (2认同)