淺談數據庫死鎖
最近碰到了一個死鎖的問題,查了一天才查出為什么會發生,查的過程中對死鎖也有點簡單的認識,下面談談我對死鎖的理解。1、死鎖是如何產生的呢?
如果事務T1封鎖了數據R1,T2封鎖了數據R2,然后T1又請求封鎖R2,因為T2已經封鎖了R2,于是T1只能等待T2釋放R2上的鎖。接著T2又請求封鎖R1,因T1已經封鎖了R1,T2也只能等待T1釋放R2上的鎖。這樣就出現了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務永遠不能結束,形成死鎖。如下圖所示:

2、如何預防和處理死鎖?
目前在數據庫中解決死鎖問題主要有兩類方法,一類是采取一定的措施來預防死鎖,另一類是允許發生死鎖,采用一定的手段定期診斷系統中有無死鎖,有則解除之。
防止死鎖其實就是要破壞產生死鎖的條件,預防死鎖通常有兩種方法:
(1)一次封鎖法
一次封鎖法要求每個事務必須一次將所有要使用的數據加上鎖,否則就不能執行。雖然這樣能有效防止死鎖,但也存在問題。第一,對全部數據加鎖,擴大了封鎖的范圍,從而降低了系統的并發度。第二,數據庫中的數據是不斷變化的,原來不要封鎖的數據,在執行的過程中可能成為封鎖的對象,所以很難事先精確確定每個事務要封鎖的數據對象,為此只能擴大封鎖范圍,進一步降低了并發度。
(2)順序封鎖發
順序封鎖法是預先對數據排定一個封鎖順序,所有的事務都按照這個順序實行封鎖。這樣也能有效防止死鎖,但也存在問題。第一,數據庫系統中封鎖的數據對象極多,并且隨著數據的變化,要維護這樣的封鎖順序是很困難的,成本很高。第二,事務的封鎖請求可能隨著事務的執行而動態的決定,很難事先要確定封鎖哪一個對象。
基于以上的分析,在目前我們采用的預防死鎖的策略不是很適合數據庫的特點,因此在解決死鎖的問題上采用的是診斷并解除死鎖的方法。
3、死鎖的診斷
診斷死鎖一般是采用超時法或事務等待圖法。超時法是一個事務等待的時間超過規定的時限,就認為發生了死鎖,但這樣有個明顯的缺點是容易產生誤判。等待圖法是一個有向圖 G=(T,U)。T為節點的集合,每個節點表示正在運行的事務;U為邊的集合,每條邊表示等待的情況,若T1等待T2,則T1到T2間劃一條有向邊,如果發現有回路,則表示發生了死鎖。
更多數據庫死鎖的解決可以參見文章:http://tech.ccidnet.com/zt/sisuo/
posted on 2008-05-13 18:36 云淡風清 閱讀(859) 評論(0) 編輯 收藏 所屬分類: DB