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 ... ;
在多個並行事務中運行這些語句時,表中會發生死鎖。通過添加行鎖提示,我能夠減少插入時的一些死鎖,但更新語句總是會導致問題。
我不是數據庫優化方面的專家,很難找出發生了什麼以及如何改進它。 有沒有人對這些問題有過專業意見?