一、活鎖
如果事務T1封鎖了數據R,事務T2又請求封鎖R,于是T2等待。T3也請求封鎖R,
當T1釋放了R上的封鎖之后系統首先批準了T3的請求,T2仍然等待。然后T4又
請求封鎖R,當T3釋放了R上的封鎖之后系統又批準了T4的請求,...,T2有可
能永遠等待,這就是活鎖的情形,避免活鎖的簡單方法是采用先來先服務的策略。
二、死鎖
如果事務T1封鎖了數據R1,T2封鎖了數據R2,然后T1又請求封鎖R2,因T2已
封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請封鎖R1,因T1已封鎖了R1,
T2也只能等待T1釋放R1上的鎖。這樣就出現了T1在等待T2,而T2又在等待T1的局面,
T1和T2兩個事務永遠不能結束,形成死鎖。
1. 死鎖的預防
在數據庫中,產生死鎖的原因是兩個或多個事務都已封鎖了一些數據對象,然后又都
請求對已為其他事務封鎖的數據對象加鎖,從而出現死等待。防止死鎖的發生其實就
是要破壞產生死鎖的條件。預防死鎖通常有兩種方法:
① 一次封鎖法
一次封鎖法要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行。
一次封鎖法雖然可以有效地防止死鎖的發生,但也存在問題,一次就將以后要用到的全
部數據加鎖,勢必擴大了封鎖的范圍,從而降低了系統的并發度。
② 順序封鎖法
順序封鎖法是預先對數據對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
順序封鎖法可以有效地防止死鎖,但也同樣存在問題。事務的封鎖請求可以隨著事務的
執行而動態地決定,很難事先確定每一個事務要封鎖哪些對象,因此也就很難按規定的
順序去施加封鎖。
可見,在操作系統中廣為采用的預防死鎖的策略并不很適合數據庫的特點,因此DBMS在
解決死鎖的問題上普遍采用的是診斷并解除死鎖的方法。
2. 死鎖的診斷與解除
① 超時法
如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖。超時法實現簡單,但
其不足也很明顯。一是有可能誤判死鎖,事務因為其他原因使等待時間超過時限,系統會
誤認為發生了死鎖。二是時限若設置得太長,死鎖發生后不能及時發現。
② 等待圖法
事務等待圖是一個有向圖G=(T,U)。 T為結點的集合,每個結點表示正運行的事務;U為
邊的集合,每條邊表示事務等待的情況。若T1等待T2,則T1、T2之間劃一條有向邊,從T1
指向T2。事務等待圖動態地反映了所有事務的等待情況。并發控制子系統周期性地(比如
每隔1分鐘)檢測事務等待圖,如果發現圖中存在回路,則表示系統中出現了死鎖。
DBMS的并發控制子系統一旦檢測到系統中存在死鎖,就要設法解除。通常采用的方法是選擇
一個處理死鎖代價最小的事務,將其撤消,釋放此事務持有的所有的鎖,使其它事務得以繼續
運行下去。當然,對撤消的事務所執行的數據修改操作必須加以恢復。
posted on 2012-06-08 17:15
chatler 閱讀(1061)
評論(0) 編輯 收藏 引用 所屬分類:
OS