2017-05-15 64 views
0

我是SQL Server DBA的新手,每天至少有一次在使用Merge語句的SQL Server 2012服務器中遇到死鎖問題。在合併聲明中沒有使用NOLOCK,UPDLOCK,HOLDLOCK等子句。這是一個多用戶環境,Biztalk讀取xml並將數據保存到SQL Server中。SQL Server死鎖 - 需要修復

每分鐘,Biztalk會讀取300個xml消息。由於它是一臺生產服務器,我不能在沒有研究的情況下執行任何操作,但我對如何解決這個問題一無所知。最近我遇到了兩個xml消息,它試圖更新表中的數據並嘗試使用相同的索引併發生錯誤。任何人都可以幫助我解決這個問題嗎?

+0

如果您可以獲得可重現的案例,請在重現它的同時運行SQL跟蹤,確保跟蹤所有'死鎖'事件。這可以爲您提供關於SQL究竟是死鎖的信息,以及確切的資源。死鎖幾乎總是由一個線程在資源A和B之後產生,而另一個線程在B之後,然後是A.有時候,您可以添加或刪除索引以消除死鎖,但有時需要修改代碼以始終獲取資源訂購。 – pmbAustin

+0

我採取了僵局追蹤並瞭解問題所在。然而,僵局並不總是發生,但往往來自合併聲明,這使我很難作出任何決定。 – aprasy

+0

死鎖圖應顯示正在死鎖的確切項目(例如,將識別特定索引的對象ID)。這就是你需要開始的地方。將會有一個非常大的ID,你可以使用這個SQL來解碼它所指的內容:SELECT hobt_id,object_name(p。[object_id]),index_id FROM sys.partitions p WHERE hobt_id = 72057594060734464 - replace with您的特定鎖ID – pmbAustin

回答

0

MERGE的掃描階段使用共享鎖(S)執行,針對運行MERGE的單個會話和運行SELECT的併發會話的情況進行了優化。在多個併發MERGE語句的情況下,這可能導致死鎖或失敗。

您應該在目標表上添加一個HOLDLOCK提示的解決方案。這與在SELECT上使用UPDLOCK的其他更新讀取模式有點不一致。