最近碰到了一個(gè)死鎖的問題,查了一天才查出為什么會(huì)發(fā)生,查的過程中對(duì)死鎖也有點(diǎn)簡(jiǎn)單的認(rèn)識(shí),下面談?wù)勎覍?duì)死鎖的理解。
1、死鎖是如何產(chǎn)生的呢?
如果事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請(qǐng)求封鎖R2,因?yàn)門2已經(jīng)封鎖了R2,于是T1只能等待T2釋放R2上的鎖。接著T2又請(qǐng)求封鎖R1,因T1已經(jīng)封鎖了R1,T2也只能等待T1釋放R2上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個(gè)事務(wù)永遠(yuǎn)不能結(jié)束,形成死鎖。如下圖所示:
2、如何預(yù)防和處理死鎖?
目前在數(shù)據(jù)庫中解決死鎖問題主要有兩類方法,一類是采取一定的措施來預(yù)防死鎖,另一類是允許發(fā)生死鎖,采用一定的手段定期診斷系統(tǒng)中有無死鎖,有則解除之。
防止死鎖其實(shí)就是要破壞產(chǎn)生死鎖的條件,預(yù)防死鎖通常有兩種方法:
(1)一次封鎖法
一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)加上鎖,否則就不能執(zhí)行。雖然這樣能有效防止死鎖,但也存在問題。第一,對(duì)全部數(shù)據(jù)加鎖,擴(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。第二,數(shù)據(jù)庫中的數(shù)據(jù)是不斷變化的,原來不要封鎖的數(shù)據(jù),在執(zhí)行的過程中可能成為封鎖的對(duì)象,所以很難事先精確確定每個(gè)事務(wù)要封鎖的數(shù)據(jù)對(duì)象,為此只能擴(kuò)大封鎖范圍,進(jìn)一步降低了并發(fā)度。
(2)順序封鎖發(fā)
順序封鎖法是預(yù)先對(duì)數(shù)據(jù)排定一個(gè)封鎖順序,所有的事務(wù)都按照這個(gè)順序?qū)嵭蟹怄i。這樣也能有效防止死鎖,但也存在問題。第一,數(shù)據(jù)庫系統(tǒng)中封鎖的數(shù)據(jù)對(duì)象極多,并且隨著數(shù)據(jù)的變化,要維護(hù)這樣的封鎖順序是很困難的,成本很高。第二,事務(wù)的封鎖請(qǐng)求可能隨著事務(wù)的執(zhí)行而動(dòng)態(tài)的決定,很難事先要確定封鎖哪一個(gè)對(duì)象。
基于以上的分析,在目前我們采用的預(yù)防死鎖的策略不是很適合數(shù)據(jù)庫的特點(diǎn),因此在解決死鎖的問題上采用的是診斷并解除死鎖的方法。
3、死鎖的診斷
診斷死鎖一般是采用超時(shí)法或事務(wù)等待圖法。超時(shí)法是一個(gè)事務(wù)等待的時(shí)間超過規(guī)定的時(shí)限,就認(rèn)為發(fā)生了死鎖,但這樣有個(gè)明顯的缺點(diǎn)是容易產(chǎn)生誤判。等待圖法是一個(gè)有向圖 G=(T,U)。T為節(jié)點(diǎn)的集合,每個(gè)節(jié)點(diǎn)表示正在運(yùn)行的事務(wù);U為邊的集合,每條邊表示等待的情況,若T1等待T2,則T1到T2間劃一條有向邊,如果發(fā)現(xiàn)有回路,則表示發(fā)生了死鎖。
更多數(shù)據(jù)庫死鎖的解決可以參見文章:http://tech.ccidnet.com/zt/sisuo/