2010-10-15 111 views
1

SQL Server死鎖的話題已經被討論了很多次,但是我不確定甚至兩個表上的同時插入最終會導致死鎖情況。在表中插入行時發生SQL Server死鎖

場景: 在測試我們的應用程序(SQL Server 2005作爲後端,ASP.net 3.5)時,我們同時向表中插入記錄(簡化概述),導致超過70%的用戶出現死鎖。 因爲這不是多資源的情況,所以我無法理解這是因爲插入是如何死鎖的。在詳細分析(由兩個用戶重現錯誤)後,我發現兩個進程都在表的主鍵索引上持有RangeS-S鎖,並試圖將其轉換爲RangeI-N鎖,導致出現死鎖和一項交易被殺害。

問題: 我們可以避免或減少這些類型的死鎖,因爲這不是資源訪問順序改變的情況嗎?不能'我們強迫事務最初獲得排他鎖,以便阻止其他進程並避免死鎖?可能有什麼(不利)影響? 也有人可以解釋更多關於RangeI-N鎖。

這是「可串行化」的隔離級別。

任何建議都會有幫助。

感謝, 拉夫

+0

您是否需要'Serializable'級別?您的交易是否也在執行「SELECT」? SQL語句是什麼樣的? – 2010-10-15 18:08:25

+0

SQL是一個簡單的存儲過程,用於插入一對夫婦或內置在sql函數中的行。當我們調用ADO.NET中的存儲過程時,會自動使用「可序列化」級別 – Gaurav 2010-10-15 18:21:09

回答

3

更改ADO隔離級別。除非你對Serializable有明確的要求,否則你不應該使用它。如果您確實使用了它,那麼您必須清楚地瞭解其後果,並且由於範圍鎖定導致的頻繁死鎖是這些後果之一。

System.Transactions的隔離級別由IsolationLevel屬性控制。

+0

如果我做了一些讀取操作,我認爲更改IsloationLevel將會很有幫助,但我不認爲這會對插入有幫助,但是,我會試試這個併發布結果。 – Gaurav 2010-10-16 17:38:49

+0

如果您不讀取,範圍鎖從哪裏來? – 2010-10-16 20:28:37

1

使用sp_getapplock獲取自定義排他鎖

+0

我也試圖獲得排他鎖,以便它阻止另一個插入,並且不會以死鎖結束。我會嘗試這個並將結果發回。 – Gaurav 2010-10-16 17:37:45