并行查询工作线程陷入死锁

Posted

技术标签:

【中文标题】并行查询工作线程陷入死锁【英文标题】:Parallel query worker thread was involved in a deadlock 【发布时间】:2012-12-12 11:48:35 【问题描述】:

我运行 SQL Server Trace 来跟踪一些死锁问题,我被这条评论 Parallel query worker thread was involved in a deadlock 作为死锁的原因而受到了打击。

Q1:这是否意味着同一个查询会自行死锁?查询执行计划显示了一些并行情况。

Q2:“强制”SQL Server 不使用并行性或至少尽可能避免使用并行性的可能方法是什么?

【问题讨论】:

在线书籍中查找 MAXDOP 【参考方案1】:

Q1:不。这只是意味着死锁涉及 Exchange 运算符。在客户端,您将收到错误消息“事务(进程 ID n)在 thread | communication buffer 资源上与另一个进程死锁,并已被选为死锁受害者。”

这类死锁总是包含两个或更多进程,并且总是包含一个锁资源。

Here is a repro 适用于这种情况。在大多数情况下,拥有正确的索引将解决此问题。

当进程自身发生死锁时(在最新版本中非常罕见),它被称为查询内并行死锁,您将收到类似“Msg 8650, Level 13, State 1, Line 1 查询内并行导致您的服务器命令(进程 ID n) 到死锁。使用查询提示选项 (maxdop 1) 重新运行查询而不使用查询内并行性。"详情请见this link。

Q2:请参阅 Denis 提供的链接。

【讨论】:

死复制链接。您能详细说明链接中的内容吗? 我相信上面提到的以前sqlindian.com/2012/07/06/deadlock-due-to-parallelism的页面已经移到readuncommitted.com/2012/07/06/deadlock-due-to-parallelism【参考方案2】:

看看Understanding and Using Parallelism in SQL Server

您还想看看使用 MAXDOP 作为查询提示

有时您只需要一个索引,请参阅Fix Execution Plan showing Parallelism

【讨论】:

以上是关于并行查询工作线程陷入死锁的主要内容,如果未能解决你的问题,请参考以下文章

ios多线程同步异步、串行并行队列、死锁

如何防止关机钩子陷入死锁?

Java面试问题,如何避免Java线程中的死锁?

多线程线性 lock

尝试访问元数据时并发 ALAssetsLibrary 迭代死锁

day18-多线程&线程同步&死锁