Deadlock

如何在 RDBMS 中檢測和報告死鎖?

  • February 26, 2012

我在面試時被問到這個論文類型的問題,但沒有得到這份工作。完整的問題如下:

如何在 RDBMS 中檢測和報告死鎖?在檢測和預防場景中,事務所有者和應用程序開發人員負責確保什麼?

在 SQL Server 中,有一個單獨的執行緒定期(預設為 5 秒,如果剛剛檢測到死鎖,則間隔更短)檢查任何週期的等待列表。即它辨識執行緒正在等待的資源,然後它找到該資源的所有者並遞歸地找到該執行緒依次等待的資源,從而辨識正在等待彼此資源的執行緒。

如果發現死鎖,則選擇使用此算法殺死受害者:

  1. 辨識不是不可殺死的執行緒(例如,回滾事務的執行緒是不可殺死的)。
  2. 找到死鎖優先級最低的執行緒。
  3. 選擇回滾成本最低的那個,即迄今為止完成的工作最少的那個。

您可以在此處找到有關 SQL Server 死鎖檢測的更多資訊:http: //msdn.microsoft.com/en-us/library/ms178104.aspx

事務所有者/應用程序開發人員負責將發生死鎖的風險降至最低,並執行他們應該:

  1. 確保盡可能縮短交易時間。例如,在開始交易後不要顯示登錄表單並等待使用者輸入,而是收集您需要的所有資訊然後執行交易。
  2. 使用盡可能低的隔離級別,例如,當您只想暫時向使用者顯示一些值時,不要設置可序列化。請注意,設置正確的隔離級別本身就是一門科學,超出了此答案的範圍。
  3. 如果您是死鎖的受害者,即您收到錯誤# 1205,然後對您的使用者透明地重新執行您的事務。由於另一個競爭事務現在有望獲得它等待並完成的資源,因此您不太可能再次遇到相同的死鎖。

引用自:https://dba.stackexchange.com/questions/13941