死鎖是兩個或多個事務無限期地等待彼此放棄鎖定的情況。 死鎖被認為是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被殺死並且隨後以隨機延遲但具有相同時間戳重新啟動。