我运行一个SQL Server跟踪来跟踪一些死锁问题,我发现此评论Parallel query worker thread was involved in a deadlock
是导致死锁的原因。
Q1:这是否意味着同一个查询会自行解锁?查询执行计划显示了一些并行性案例。
Q2:有哪些方法可以“强制”SQL Server不使用并行性,或者至少避免尽可能地使用它?
答案 0 :(得分:8)
Q1:否。这只是意味着死锁涉及Exchange运营商。在客户端,您将收到错误“事务(进程ID n)在{thread | 通信缓冲区}资源上与另一个进程死锁,并被选为死锁牺牲品。”
这种死锁将始终包含两个或多个进程,并且始终包含锁资源。
对于这种情况,Here is a repro。在大多数情况下,拥有正确的索引将解决此问题。
当一个进程与自身发生死锁时(非常罕见的最新版本),它被称为内部查询并行性死锁,你会收到一个错误,如“Msg 8650,Level 13,State 1,Line 1内部查询并行性导致你的服务器命令(进程ID n)到死锁。使用查询提示选项(maxdop 1)重新运行没有查询内并行性的查询。“有关详细信息,请参阅this link。
Q2:请参阅Denis提供的链接。
答案 1 :(得分:3)
查看Understanding and Using Parallelism in SQL Server
您还想看一下使用MAXDOP作为查询提示
有时您需要的只是一个索引,请参阅Fix Execution Plan showing Parallelism