淺談數據庫死鎖

              最近碰到了一個死鎖的問題,查了一天才查出為什么會發生,查的過程中對死鎖也有點簡單的認識,下面談談我對死鎖的理解。
              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


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


          網站導航:
           
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類(15)

          隨筆檔案(15)

          收藏夾(1)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 仪征市| 霸州市| 乳山市| 陇川县| 清涧县| 济源市| 镇原县| 沧州市| 建瓯市| 周口市| 安多县| 循化| 恩施市| 灵台县| 朔州市| 尉氏县| 南陵县| 浦城县| 新建县| 友谊县| 平利县| 剑川县| 岱山县| 游戏| 江达县| 尚志市| 保德县| 博罗县| 海兴县| 寿宁县| 仁寿县| 大名县| 柘城县| 共和县| 永泰县| 巨野县| 余庆县| 宾川县| 昭平县| 容城县| 方山县|