DBMS死鎖


死鎖是兩個或多個事務無限期地等待彼此放棄鎖定的情況。 死鎖被認為是DBMS中最令人恐懼的並行症之一,因為任務都沒有完成,並且永遠處於等待狀態。

例如:student表中,事務T1對某些行進行鎖定,需要更新grade表中的某些行。 同時,事務T2在等級表中的某些行上保持鎖定,並且需要更新事務T1持有的Student表中的行。

現在,出現了問題。事務T1正在等待T2釋放其鎖定,同樣,事務T2正在等待T1釋放其鎖定。 所有活動都陷入停頓狀態並保持停滯狀態。 它將保持靜止狀態,直到DBMS檢測到死鎖並中止其中一個事務。

死鎖避免

當資料庫陷入死鎖狀態時,最好避免使用資料庫而不是中止或重新啟動資料庫。 這是浪費時間和資源。
死鎖避免機制用於預先檢測任何死鎖情況。 像「等待圖」這樣的方法用於檢測死鎖情況,但該方法僅適用於較小的資料庫。 對於較大的資料庫,可以使用死鎖預防方法。

死鎖檢測

在資料庫中,當事務無限期地等待獲取鎖時,DBMS應檢測事務是否涉及死鎖。 鎖管理器維護等待圖以檢測資料庫中的死鎖迴圈。

等待圖

  • 這是用於死鎖檢測的合適方法。 在此方法中,將根據事務及其鎖定建立圖。 如果建立的圖具有迴圈或閉環,則存在死鎖。
  • 對於等待其他人持有的某些資料的每個事務,系統維護等待圖。 如果圖中有任何迴圈,系統將繼續檢查圖。

等待上述場景的圖如下所示:

死鎖預防

死鎖防止方法適用於大型資料庫。 如果以永遠不會發生死鎖的方式分配資源,則可以防止死鎖。
資料庫管理系統分析事務的操作是否可以建立死鎖情況。 如果他們這樣做,那麼DBMS從不允許執行該事務。

等待模式

在此模式中,如果事務請求已由另一個事務保持衝突鎖定的資源,則DBMS只檢查兩個事務的時間戳。 它允許舊事務等待資源可用於執行。

假設存在兩個事務Ti和Tj,並且讓TS(T)是任何事務T的時間戳。如果T2通過某個其他事務持有鎖並且T1請求T2持有的資源,則DBMS執行以下操作:

  • 檢查TS(Ti)<TS(Tj) - 如果Ti是較舊的事務並且Tj保留了一些資源,則允許Ti等待直到資料項可用於執行。這意味著如果較舊的事務正在等待由較年輕的事務鎖定的資源,則允許較舊的事務等待資源直到它可用。
  • 檢查TS(Ti)<TS(Tj) - 如果Ti是較舊的事務並且保留了一些資源並且如果Tj正在等待它,則Tj被殺死並且隨後以隨機延遲但具有相同時間戳重新啟動。

創傷等待模式

  • 在創傷等待方案中,如果較舊的事務請求由較新的事務持有的資源,則較舊的事務迫使較新的事務殺死該事務並釋放該資源。 在分鐘延遲之後,重新啟動較新的事務但具有相同的時間戳。
  • 如果舊事務持有較新事務請求的資源,則要求較新的事務等到較早發布它。