我是新手作为SQL Server DBA,每天至少一次我在使用Merge语句的SQL Server 2012服务器中遇到死锁问题。在合并语句中没有使用像NOLOCK
,UPDLOCK
,HOLDLOCK
这样的子句。这是一个多用户环境,Biztalk读取xml并将数据保存到SQL Server中。
每分钟,Biztalk读取300 xml消息。由于它是一个生产服务器,我不能在没有做研究的情况下实现任何东西,但我对如何解决这个问题一无所知。最近我遇到了两个xml消息的问题,这些消息试图更新表中的数据并尝试使用相同的索引并错误地输出。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
MERGE的扫描阶段使用共享锁(S)执行,针对运行MERGE的单个会话和运行SELECT的并发会话进行了优化。在多个并发MERGE语句的情况下,这可能导致死锁或失败。
您应该在目标表上添加HOLDLOCK提示的解决方案。这与在SELECT上使用UPDLOCK的其他read-for-update模式有点不一致。