并行查询工作线程陷入死锁
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
【讨论】:
以上是关于并行查询工作线程陷入死锁的主要内容,如果未能解决你的问题,请参考以下文章