Blo*_*ard 22 sql-server deadlock sql-server-2008 database-deadlocks
我有一个报告死锁的错误日志:
事务(进程ID 55)在锁定时死锁 与另一个进程通信缓冲资源并被选为死锁牺牲品.重新运行该交易.
我试图重现此错误,但我的标准死锁SQL代码产生一个不同的错误:
事务(进程ID 54)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品.重新运行该交易.
我想非常清楚,我不是在问什么是僵局.我完全理解基础知识.
我的问题是:lock | communication buffer resources
在这种情况下的含义是什么?什么是"通信缓冲资源"?这lock |
意味着什么吗?
我最好的猜测是当并行线程结合其结果时使用通信缓冲区.任何人都可以确认或否认这个吗?
我的最终目标是以某种方式触发第一个错误再次发生.
我会将该消息解释为锁定资源或通信缓冲区资源的某些组合上的死锁。“锁资源”是普通对象锁,“通信缓冲区资源”是用于组合并行查询结果的交换事件。这些在https://blogs.msdn.microsoft.com/bartd/2008/09/24/todays-annoyingly-unwieldy-term-intra-query-parallel-thread-deadlocks/中有进一步描述,其中相关段落是:
“exchangeEvent”资源指示查询计划中是否存在并行运算符。这个想法是将大型扫描、排序或连接等操作的工作进行划分,以便可以在多个子线程上执行。有一些“生产者”线程执行繁重的工作并将行集提供给“消费者”。查询内并行需要在这些工作线程之间发送信号:消费者可能必须等待生产者向他们提供更多数据,而生产者可能必须等待消费者完成对最后一批数据的处理。与并行性相关的等待在 SQL DMV 中显示为 CXPACKET 或 EXCHANGE 等待类型(请注意,这些等待类型的存在是正常的,并且仅指示并行查询执行的存在 - 就其本身而言,这些等待并不指示此类型或发生任何其他类型的死锁)。
我见过的其中一个死锁图包括一组只有一个 SPID 的进程以及一个对象锁和交换事件图。我猜想消息“事务(进程 ID 55)在锁 | 与另一个进程的通信缓冲区资源上死锁,并已被选为死锁受害者。重新运行事务”出现,而不是“查询内并行性导致您的服务器命令(进程 ID) #51) 导致死锁。由于对象锁和交换事件的组合,请使用查询提示选项 (maxdop 1)" 在没有查询内并行性的情况下重新运行查询,或者自本文撰写以来,SQL Server 中的消息已更改。
小智 2
您的问题与并行性相关,并且该错误“没有意义”,因为错误消息没有反映您的问题,并且不要去更改 maxdope 设置。为了找到错误的原因,您需要使用跟踪标志 1204 ,看看如何使用跟踪标志以及您获得的信息。
当您执行此操作时,您将得到有关导致锁定的原因、位置和代码行的答案。我想你可以从那时开始搜索自己,如果没有,那么发布它,你会得到你需要的答案。
归档时间: |
|
查看次数: |
20362 次 |
最近记录: |