SQL合并与外键和解决死锁表的语句(SQL merge statements on tables w

2019-10-18 04:34发布

我有一对夫妇,我执行事务中从ADO.NET代码中的MERGE语句的。

插入表时,第一个表的ID将被自动分配。 第二个表确实有一个外键约束,这就是为什么我有这样的选择在我的INSERT语句。

匹配实际上是基于一些自然关键,因为代理键而不是应用程序暴露在外。

合并报表看起来像这些。

merge MyTable with (rowlock, updlock) as t
using #someTempTable as s
on (t.[VarcharColumn] = s.[VarcharColumn])
when not matched by target
   then insert (...)
   values (...)
when matched
   then update set ... ;

merge SecondTable with (rowlock, updlock) as t
using #otherTempTable as s
on (t.[] = s.[])
when not matched by target
   then insert ([OtherColumn],[MyTable_Id])
   values (s.[OtherColumn], 
          (select Id from MyTable where MyTable.[VarcharColumn] = s.[VarcharColumn]))
when matched
   then update set ... ;

当运行在多个并行交易这些语句,死锁发生在表上。 我能够通过增加ROWLOCK提示以减少对插入一些死锁,而是更新语句总是会引起问题。

我不是在数据库优化方面的专家,也很难找到发生了什么,以及如何改进它。 有没有人对这些问题的一些专业意见?

Answer 1:

修改你的锁提示WITH (HOLDLOCK) 这将导致MERGE语句在整个语句保持在受影响的行锁,并应消除死锁。



文章来源: SQL merge statements on tables with foreign keys and resolving deadlocks