2017-05-15 65 views
0

我是SQL Server DBA的新手,每天至少有一次在使用Merge语句的SQL Server 2012服务器中遇到死锁问题。在合并声明中没有使用NOLOCK,UPDLOCK,HOLDLOCK等子句。这是一个多用户环境,Biztalk读取xml并将数据保存到SQL Server中。SQL Server死锁 - 需要修复

每分钟,Biztalk会读取300个xml消息。由于它是一台生产服务器,我不能在没有研究的情况下执行任何操作,但我对如何解决这个问题一无所知。最近我遇到了两个xml消息,它试图更新表中的数据并尝试使用相同的索引并发生错误。任何人都可以帮助我解决这个问题吗?

+0

如果您可以获得可重现的案例,请在重现它的同时运行SQL跟踪,确保跟踪所有'死锁'事件。这可以为您提供关于SQL究竟是死锁的信息,以及确切的资源。死锁几乎总是由一个线程在资源A和B之后产生,而另一个线程在B之后,然后是A.有时候,您可以添加或删除索引以消除死锁,但有时需要修改代码以始终获取资源订购。 – pmbAustin

+0

我采取了僵局追踪并了解问题所在。然而,僵局并不总是发生,但往往来自合并声明,这使我很难作出任何决定。 – aprasy

+0

死锁图应显示正在死锁的确切项目(例如,将识别特定索引的对象ID)。这就是你需要开始的地方。将会有一个非常大的ID,你可以使用这个SQL来解码它所指的内容:SELECT hobt_id,object_name(p。[object_id]),index_id FROM sys.partitions p WHERE hobt_id = 72057594060734464 - replace with您的特定锁ID – pmbAustin

回答

0

MERGE的扫描阶段使用共享锁(S)执行,针对运行MERGE的单个会话和运行SELECT的并发会话的情况进行了优化。在多个并发MERGE语句的情况下,这可能导致死锁或失败。

您应该在目标表上添加一个HOLDLOCK提示的解决方案。这与在SELECT上使用UPDLOCK的其他更新读取模式有点不一致。