2011-09-01 52 views
5

有人可以帮助我阅读/理解这个死锁图吗?阅读SQL死锁图

我不明白为什么进程75正在请求锁定一个已锁定对象的对象?

Deadlock graph

+0

你可以发送“显示innoDB状态”响应吗?它会提供更多信息。它应该包含最后的死锁 – varela

+0

@varela - 这是SQL Server。 jaques什么版本?看起来像一个并列主义问题。 –

+0

@Martin Smith。 SQL Server 2008 – Jacques

回答

7

据我已经找到了一个“交换”事件是否存在等一个博客文章指出,您的问题的来源可以在您的查询的并行性。

Today's Annoyingly-Unwieldy Term: "Intra-Query Parallel Thread Deadlocks"

以上文章进入更多的细节,但是点睛之笔是:

解决方法1:添加索引或提高查询,以消除并行的需要。在大多数情况下,在查询中使用并行性表明您有非常大的扫描,排序或连接,并且不受适当索引支持。如果你调整查询,你会经常发现你最终得到了一个更快,更高效的不使用并行性的计划,因此不会遇到这种类型的问题。当然,在某些查询中(特别是DSS/OLAP类型的查询),可能很难消除所有大型扫描。

解决方法#2:在查询结束时强制执行带有“OPTION(MAXDOP 1)”查询提示的单线程执行。如果您无法修改查询,则可以将该提示应用于具有计划指南的任何查询。

您可能想试试看看是否有任何改进。

+0

谢谢,我设法识别和改进了一个缓慢运行的查询,并从那以后没有锁。不知道未来如何防止这种情况发生?而且,如果SQL服务器有可能陷入僵局,为什么要聪明呢? (E.G为什么使用并行性?) – Jacques

+0

引用的链接集中在只有一个SPID(因此“内部查询”)的“纯”交换事件内部查询死锁。问题的死锁图包括交换事件_plus_,涉及2个查询(另一个SPID)的更传统的死锁。我已经读过,孤立的死锁交换事件可以自行修复(因为它们可能是由于内部错误),所以焦点应该放在其他共享对象上 - 本例中的页面锁定。 – crokusek