2010-08-30 64 views
2

我試着讀一篇關於鎖和死鎖的文章,它只是不着陸,不同類型的鎖。 我們正在運行2個不同的進程,它們試圖編輯同一個表中的記錄。 第一個進程讀取新數據並將其發送給外部方並相應地更新狀態,另一個進程接收來自外部方的接收結果並相應地更新狀態。有沒有一種方法來防止死鎖(以及發生了什麼是一個發生,一個受害)

現在我們越來越多的死鎖(在這種情況下,其中一個是victom並被中止)。到目前爲止這麼好,因爲你可以預見到這一點,並嘗試重新運行該聲明,但總是發生同樣的死鎖。這就是我的第一個問題:爲什麼同樣的死鎖總是再次發生?

第二,有沒有辦法告訴dbms,當另一個進程正在讀取和更新記錄時,不要嘗試獲取記錄的獨佔鎖(我們通過存儲過程更新單個記錄),而是'等待一邊'直到另一個進程準備好了?或者說是一個太簡單的事情來說死鎖?

並且可能是第三個,有沒有辦法向LINQ to SQL詢問哪些鎖導致了問題,所以我對該進程的哪些部分導致問題有所瞭解。

回答

1

正如@Darryl Peterson所指出的,SQL Profiler是捕獲死鎖信息的好工具。如果您不知道何時會發生死鎖,則可以設置SQL Server跟蹤標誌來捕獲數據。

DBCC TRACEON (1204) 

當發生死鎖時,有關死鎖的信息將寫入SQL Server錯誤日誌。

有很多方法可以導致死鎖。你的第一個問題「爲什麼總是發生同樣的僵局」可能是一個好兆頭。如果死鎖是可重複的,那麼你可以捕捉並修復它。

關於第二個問題,SQL Server可能已經告訴一個進程要等待另一個進程完成。但是,你無法通過等待來避免僵局。死鎖是一個進程試圖使用另一個進程持有的資源的情況。但另一個進程正在等待第一個進程持有的資源。這兩個進程在完成其工作之前都不會釋放資源。請注意,這是一個簡單的解釋,可能會有更復雜的死鎖情況。重點是,在死鎖過程中將會從永遠不能能夠完成。

一旦您瞭解到有關死鎖涉及的過程的更多信息,您應該能夠採取措施避免它。

4

SQL事件探查器是我用來開始嘗試解決SQL Server中的死鎖問題的最佳工具。

開始跟蹤: 在事件選擇選項卡上: 取消選中所有預選事件。 選中「顯示所有事件」。 展開「鎖定」。 選中「死鎖圖形」,「鎖定:死鎖」和「鎖定死鎖鏈」。

運行跟蹤並捕獲死鎖事件。

查看SQL事件探查器中的死鎖事件。死鎖顯示非常好。您可能仍然需要查看原始XML以獲取更多詳細信息。

使用您從第一遍中發現的內容,可能會提供有關更改內容的建議,或建議在SQL事件探查器中跟蹤其他事件。

相關問題