我有一对夫妇,我执行事务中从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提示以减少对插入一些死锁,而是更新语句总是会引起问题。
我不是在数据库优化方面的专家,也很难找到发生了什么,以及如何改进它。 有没有人对这些问题的一些专业意见?