“lock | communication buffer resources”是什么意思?它涉及到IT技术。

40
我有一个错误日志,报告了一个死锁问题:
交易(进程 ID 55)被死锁在“锁定|通信缓冲资源”上与另一个进程,并被选择为死锁牺牲者。重新运行交易。
我正在尝试重现此错误,但我的标准死锁 SQL 代码产生了一个不同的错误:
交易(进程 ID 54)被死锁在“锁定资源”上与另一个进程,并被选择为死锁牺牲者。重新运行交易。
我想非常清楚地表明我不是在问什么是死锁。我确实了解基础知识。
我的问题是:在这种情况下,“锁 | 通信缓冲资源”的含义是什么?“通信缓冲资源”是什么?“锁 |”表示任何东西吗?
我最好的猜测是,在并行线程合并其结果时使用通信缓冲区。有人可以确认或否认这一点吗?
我的最终目标是以某种方式再次触发第一个错误。

据我所知,你的“最佳猜测”是准确的,你将从并行计划中看到这条消息。你还在遇到这些错误吗?如果是这样,你能从默认的扩展事件会话中检索死锁图吗? - Martin Smith
@BillHurt 很有趣!我之前没有看到过。 - Blorgbeard
@MartinSmith 好的,是的,看起来肯定与并行计划有关。我现在已经继续前进了,所以无法检查死锁图。我想我永远不会知道确切原因了。 - Blorgbeard
3
谢谢,但请阅读问题中的粗体文字。这里再次写出来:我不是在询问死锁是什么。 - Blorgbeard
1
还可以参考DBA Stackexchange上非常类似的问题:https://dba.stackexchange.com/questions/49538/sql-server-deadlocked-on-lock-communication-buffer-resources/72170 - Jon Schneider
显示剩余8条评论
4个回答

5
我将解释这条消息表示某些锁资源或通信缓冲区资源的组合形成了死锁。 "锁资源" 是普通对象锁,而 "通信缓冲区资源" 是用于组合并行查询结果的 exchangeEvent。有关此类资源的更多信息,请参见 https://blogs.msdn.microsoft.com/bartd/2008/09/24/todays-annoyingly-unwieldy-term-intra-query-parallel-thread-deadlocks/,相关段落如下:

"exchangeEvent" 资源表示查询计划中存在并行操作符。其想法是将类似于大规模扫描、排序或连接等操作的工作分割成多个子线程上执行。有些 "生产者" 线程负责执行实际工作并向 "消费者" 提供一组行数据。在查询中使用的并行查询需要在这些工作线程之间进行信号传递:消费者可能必须等待生产者提供更多数据,而生产者可能还必须等待消费者完成上一批数据的处理。与并行相关的等待会以 SQL DMV 中的 CXPACKET 或 EXCHANGE 等待类型出现 (请注意,这些等待类型的存在是正常的,仅表明存在并行查询执行。它们本身并不表示发生了死锁,无论是这种类型还是其他类型)。

我曾经看到其中一个死锁图包括一组进程,只有一个 SPID 和一组对象锁和 exchangeEvent。我猜测之所以出现消息 "Transaction (Process ID 55) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction" 而不是 "Intra-query parallelism caused your server command (process ID #51) to deadlock. Rerun the query without intra-query parallelism by using the query hint option (maxdop 1)" 是因为出现了对象锁和 exchangeEvent 的组合,或者自从该文章发表后,SQL Server 中的消息已经发生了更改。

2
你的问题与并行性有关,错误信息“没有意义”,因为它不能反映你的问题。不要更改maxdope设置。为了找到错误的原因,你需要使用跟踪标志1204 ,查看如何使用跟踪标志以及获取的信息
这样做后,你会得到导致锁定的代码是什么、在哪里以及为什么。我想你能够通过谷歌自己解决这个问题,如果不能,请发布问题,你将得到所需的答案。

我不同意,虽然这是一条针对死锁的普遍良好建议,但并不适用于这种更像是误命名而非死锁的特定错误。在这种情况下,最好查看其他查询,因为其过高的并行性导致了内存消耗的禁止。而maxdop只是一种快速而且不太完美(不是永久性)的解决方法。 - eckes

2

你可以使用MAXDOP 1作为查询提示 - 即在一个CPU上运行该查询 - 而不影响服务器的其余部分。

这将避免该查询的错误 - 不会告诉您为什么它失败,但如果您必须快速使其工作,则提供了解决方法 :-)


2
我的问题是:在这种情况下,“锁定|通信缓冲区资源”的含义是什么?“通信缓冲区资源”是什么意思?“|”符号有什么特殊含义吗? - Martin Smith
2
简单来说,由于某个会话正在使用该行,因此您无法对其执行更新操作。 - RoMEoMusTDiE
根据我的经验,即使是单执行器查询,如果它们与具有高并行性的其他查询发生冲突,设置maxdop对特定查询可能没有帮助。因此,您需要在其他查询或整个数据库上设置提示。 - eckes

2

只需要在这里更新一下,让其他人受益,对我来说,这是一个奇怪的错误消息,花了很多时间围绕着这个错误消息工作。最后在网上得到了一个线索,应该使用查询选项MAXDOP 1来避免并行处理。当我选择它时,错误消息完全不同了。实际上,这是由于插入语句在varchar列中引起的字符串截断,调整要摄取的字符串的长度,一切都恢复正常了。

希望能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接