2013-05-29 54 views
1

我有一些MERGE語句,我在ADO.NET代碼中的事務中執行。SQL與外鍵表和解決死鎖的合併語句

當插入表格時,第一個表的Id將被自動分配。 第二個表確實有一個外鍵約束,這就是爲什麼我在我的insert語句中選擇這個選項。

匹配實際上是基於一些自然鍵,因爲代理鍵不暴露在應用程序之外。

MERGE語句看起來像這樣。

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 ... ; 

在多個並行事務中運行這些語句時,表中會發生死鎖。通過添加行鎖提示,我能夠減少插入時的一些死鎖,但更新語句總是會導致問題。

我不是數據庫優化方面的專家,很難找出發生了什麼以及如何改進它。 有沒有人對這些問題有過專業意見?

回答

0

將您的鎖定提示修改爲WITH (HOLDLOCK)。這將導致MERGE語句在整個語句中保持對受影響的行的鎖定並消除死鎖。