我有一个报告死锁的错误日志:
事务(进程ID 55)在 lock |上死锁通信缓冲区资源与另一个进程并被选为死锁牺牲品。重新运行该交易。
我正在尝试重现此错误,但我的标准死锁SQL代码会产生不同错误:
事务(进程ID 54)在锁定资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。
我想非常清楚我不是在问什么是死锁。我完全理解基础知识。
我的问题是:lock | communication buffer resources
在这种情况下的含义是什么?什么是“通信缓冲资源”? lock |
表示什么意思吗?
我最好的猜测是当并行线程合并其结果时使用通信缓冲区。任何人都可以确认或否认这个吗?
我的最终目标是以某种方式触发第一个错误再次发生。
答案 0 :(得分:1)
您的问题与并行相关,错误“没有意义”,因为错误消息没有反映您的问题,也没有不去更改maxdope设置。为了找到错误原因,您需要使用跟踪标志1204 , have a look as to how to use the trace flag and what info you get。
当你这样做时,你会得到关于为什么,在哪里以及什么行代码导致锁定的答案。我想你可以从那时开始谷歌你的自我,如果没有,那么发布它,你会得到你需要的答案。
答案 1 :(得分:1)
我会将消息解释为锁定资源或通信缓冲区资源的某种组合上的死锁。 “锁资源”是普通的对象锁,“通信缓冲区资源”是用于合并并行查询结果的exchangeEvents。这些在https://blogs.msdn.microsoft.com/bartd/2008/09/24/todays-annoyingly-unwieldy-term-intra-query-parallel-thread-deadlocks/中进一步描述,其中相关段落为:
“ exchangeEvent”资源指示查询计划中是否存在并行运算符。想法是将诸如大型扫描,排序或联接之类的操作的工作进行拆分,以便可以在多个子线程上执行该工作。有“生产者”线程可以完成繁重的工作,并将行集提供给“消费者”。查询内并行需要这些工作线程之间的信号传递:使用者可能必须等待生产者向他们提供更多数据,而生产者可能必须等待使用者完成对最后一批数据的处理。与并行相关的等待在SQL DMV中显示为CXPACKET或EXCHANGE等待类型(请注意,这些等待类型的存在是正常现象,仅表示并行查询执行的存在;就其本身而言,这些等待并不表示该类型或任何其他类型的死锁都在发生)。
我见过的其中一个的死锁图包括一组只有一个SPID的进程以及一个对象锁和exchangeEvents图。我猜想消息“事务(进程ID 55)在另一个进程的锁上被锁死了|通信缓冲区资源,并被选择为死锁受害者。重新运行事务” 出现,而不是“ Intra -query并行性导致服务器命令(进程ID#51)死锁。由于对象锁和exchangeevents的组合,请使用查询提示选项(maxdop 1)“ 重新运行查询,而无需查询内并行性。自撰写本文以来,该消息已在SQL Server中更改。
答案 2 :(得分:0)
您可以使用MAXDOP 1作为查询提示 - 即在一个CPU上运行该查询 - 而不会影响服务器的其余部分。
这将避免该查询的错误 - 不告诉你为什么它失败但是如果必须让它快速运行则提供解决方法: - )