淺談數(shù)據(jù)庫死鎖

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

              2、如何預防和處理死鎖?
              目前在數(shù)據(jù)庫中解決死鎖問題主要有兩類方法,一類是采取一定的措施來預防死鎖,另一類是允許發(fā)生死鎖,采用一定的手段定期診斷系統(tǒng)中有無死鎖,有則解除之。
              防止死鎖其實就是要破壞產(chǎn)生死鎖的條件,預防死鎖通常有兩種方法:
              (1)一次封鎖法
              一次封鎖法要求每個事務必須一次將所有要使用的數(shù)據(jù)加上鎖,否則就不能執(zhí)行。雖然這樣能有效防止死鎖,但也存在問題。第一,對全部數(shù)據(jù)加鎖,擴大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。第二,數(shù)據(jù)庫中的數(shù)據(jù)是不斷變化的,原來不要封鎖的數(shù)據(jù),在執(zhí)行的過程中可能成為封鎖的對象,所以很難事先精確確定每個事務要封鎖的數(shù)據(jù)對象,為此只能擴大封鎖范圍,進一步降低了并發(fā)度。
              (2)順序封鎖發(fā)
              順序封鎖法是預先對數(shù)據(jù)排定一個封鎖順序,所有的事務都按照這個順序?qū)嵭蟹怄i。這樣也能有效防止死鎖,但也存在問題。第一,數(shù)據(jù)庫系統(tǒng)中封鎖的數(shù)據(jù)對象極多,并且隨著數(shù)據(jù)的變化,要維護這樣的封鎖順序是很困難的,成本很高。第二,事務的封鎖請求可能隨著事務的執(zhí)行而動態(tài)的決定,很難事先要確定封鎖哪一個對象。
              基于以上的分析,在目前我們采用的預防死鎖的策略不是很適合數(shù)據(jù)庫的特點,因此在解決死鎖的問題上采用的是診斷并解除死鎖的方法。
              3、死鎖的診斷
              診斷死鎖一般是采用超時法或事務等待圖法。超時法是一個事務等待的時間超過規(guī)定的時限,就認為發(fā)生了死鎖,但這樣有個明顯的缺點是容易產(chǎn)生誤判。等待圖法是一個有向圖 G=(T,U)。T為節(jié)點的集合,每個節(jié)點表示正在運行的事務;U為邊的集合,每條邊表示等待的情況,若T1等待T2,則T1到T2間劃一條有向邊,如果發(fā)現(xiàn)有回路,則表示發(fā)生了死鎖。

              更多數(shù)據(jù)庫死鎖的解決可以參見文章:http://tech.ccidnet.com/zt/sisuo/

             


          posted on 2008-05-13 18:36 云淡風清 閱讀(859) 評論(0)  編輯  收藏 所屬分類: DB


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆分類(15)

          隨筆檔案(15)

          收藏夾(1)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 环江| 佛坪县| 乌兰浩特市| 讷河市| 孙吴县| 都安| 石台县| 舟曲县| 西城区| 宜兰县| 洪湖市| 石屏县| 常山县| 云阳县| 裕民县| 沁水县| 海兴县| 宣化县| 瓦房店市| 汶上县| 涡阳县| 阿拉善盟| 大田县| 赤峰市| 澜沧| 金阳县| 英山县| 盘山县| 深水埗区| 沅江市| 二连浩特市| 化德县| 神农架林区| 上杭县| 敦煌市| 长兴县| 米林县| 屏边| 新沂市| 磐安县| 漯河市|