隨筆 - 6, 文章 - 0, 評論 - 0, 引用 - 0
          數據加載中……

          DB2鎖介紹[轉]

          3        DB2 多粒度封鎖機制介紹
          3.1        鎖的對象
          DB2支持對表空間、表、行和索引加鎖(大型機上的數據庫還可以支持對數據頁加鎖)來保證數據庫的并發完整性。不過在考慮用戶應用程序的并發性的問題上,通常并不檢查用于表空間和索引的鎖。該類問題分析的焦點在于表鎖和行鎖。
          3.2        鎖的策略
          DB2可以只對表進行加鎖,也可以對表和表中的行進行加鎖。如果只對表進行加鎖,則表中所有的行都受到同等程度的影響。如果加鎖的范圍針對于表及下屬的行,則在對表加鎖后,相應的數據行上還要加鎖。究竟應用程序是對表加行鎖還是同時加表鎖和行鎖,是由應用程序執行的命令和系統的隔離級別確定。
          3.2.1        DB2表鎖的模式
          DB2在表一級加鎖可以使用以下加鎖方式:
          名稱縮寫        全名        描述
          IN        無意圖鎖 (Intenet None)
          不需要行鎖        該鎖的擁有者可以讀表中的任何數據,包括其他事務尚未提交的數據,但不能對表中的數據進行更改。
          IS        意圖共享鎖(Intent Share)需要行鎖配合        該鎖的擁有者在擁有相應行的上的S鎖時可以讀取該行的數據。但不能對表中的數據進行更改。
          IX        意圖排它鎖(Intent eXclusive)需要行鎖配合        該鎖的擁有者在擁有相應行的X鎖時可以更改該行的數據。
          SIX        共享攜意圖排它鎖
          (Share with Intent exclusive)需要行鎖配合        鎖的擁有者可以讀表中的任何數據,如果在相應的行上能夠獲得X鎖,則可以修改該行。SIX鎖的獲得比較特殊,它是在應用程序已經擁有IX鎖的情況下請求S鎖或者是在應用程序已經擁有S鎖的情況下請求IX鎖時生成的。
          S        共享鎖(Share)不需要行鎖配合        鎖的擁有者可以讀表中的任何數據,如果表上被加上S鎖,該表中的數據就只能被讀取,不能被改變。
          U        更新鎖(Update)
          不需要行鎖配合        鎖的擁有者可以讀表中的任何數據,如果在升級到X鎖之后,可以更改表中的任何數據。該鎖是處于等待對數據進行更改的一種中間狀態。
          X        排它鎖
          (eXclusive)
          不需要行鎖配合        鎖的擁有者可以讀取或更改表中的任何數據。如果對表加上X鎖,除了未提交讀程序,其他應用程序都不能對該表進行存取。
          Z        超級排它鎖
          (Super Exclusive)
          不需要行鎖配合        該鎖不是通過應用程序中的DML語言來生成的。一般是通過對表進行刪除(Drop)和轉換(Alter)操作或創建和刪除索引而獲得的。如果對表上加上Z鎖,其他應用程序,包括未提交讀程序都不能對該表進行存取。
          表三:DB2數據庫表鎖的模式
          下面對幾種表鎖的模式進一步加以闡述:
            IS、IX、SIX方式用于表一級并需要行鎖配合,他們可以阻止其他應用程序對該表加上排它鎖。
          ?        如果一個應用程序獲得某表的IS鎖,該應用程序可獲得某一行上的S鎖,用于只讀操作,同時其他應用程序也可以讀取該行,或是對表中的其他行進行更改。
          ?        如果一個應用程序獲得某表的IX鎖,該應用程序可獲得某一行上的X鎖,用于更改操作,同時其他應用程序可以讀取或更改表中的其他行。
          ?        如果一個應用程序獲得某表的SIX鎖,該應用程序可以獲得某一行上的X鎖,用于更改操作,同時其他應用程序只能對表中其他行進行只讀操作。
          S、U、X和Z方式用于表一級,但并不需要行鎖配合,是比較嚴格的表加鎖策略。
          ?        如果一個應用程序得到某表的S鎖。該應用程序可以讀表中的任何數據。同時它允許其他應用程序獲得該表上的只讀請求鎖。如果有應用程序需要更改讀該表上的數據,必須等S鎖被釋放。
          ?        如果一個應用程序得到某表的U鎖,該應用程序可以讀表中的任何數據,并最終可以通過獲得表上的X鎖來得到對表中任何數據的修改權。其他應用程序只能讀取該表中的數據。U鎖與S鎖的區別主要在于更改的意圖上。U鎖的設計主要是為了避免兩個應用程序在擁有S鎖的情況下同時申請X鎖而造成死鎖的。
          ?        如果一個應用程序得到某表上的X鎖,該應用程序可以讀或修改表中的任何數據。其他應用程序不能對該表進行讀或者更改操作。
          ?        如果一個應用程序得到某表上的Z鎖,該應用程序可以讀或修改表中的任何數據。其他應用程序,包括未提交讀程序都不能對該表進行讀或者更改操作。
          IN鎖用于表上以允許未提交讀這一概念。
          3.2.2        DB2行鎖的模式
          除了表鎖之外,DB2還支持以下幾種方式的行鎖。
          名稱縮寫        全名        需要表鎖的最低級別        描述
          S        共享鎖
          (Share)        IS        該行正在被某個應用程序讀取,其他應用程序只能對該行進行讀操作。
          U        更改鎖
          (Update)        IX        某個應用程序正在讀該行并有可能更改該行,其他應用程序只能讀該行。
          X        排它鎖
          (eXclusive)        IX        該行正在被某個應用程序更改,其他應用程序不能訪問該行。
          W        弱排它鎖
          (Weak eXclusive)        IX        當一行數據被插入表中的時候,該行上會被加上W鎖。鎖的擁有者能夠更改該行,該鎖基本與X鎖相同,除了它與NW鎖兼容。
          NS        下一鍵共享鎖
          (Next Key Share)        IS        鎖的擁有者和其他程序都可以讀該行,但不能對該行進行更改。當應用程序處于RS或CS隔離級下,該鎖用來替代S鎖。
          NX        下一鍵排它鎖
          (Next Key eXclusive)        IX        當一行數據被插入到索引中或從索引中被刪除的時候,該行的下一行上會被加上該鎖。鎖的擁有者可以讀,但不能更改鎖定行。該鎖與X鎖類似,只是與NS鎖兼容。
          NW        下一鍵弱排它鎖
          (Next Key Weak eXclusive)        IX        當一行被插入到索引中的時候,該行的下一行會被加上該鎖。鎖的擁有者可以讀但不能更改鎖定行。該鎖與X和NX鎖類似,只是與W和NS鎖兼容。
          表四:DB2數據庫行鎖的模式
          DB2鎖的兼容性       

          鎖A的模式        鎖B的模式
                  IN        IS        S        IX        SIX        U        X        Z
          IN        Y        Y        Y        Y        Y        Y        Y        N
          IS        Y        Y        Y        Y        Y        Y        N        N
          S        Y        Y        Y        N        N        Y        N        N
          IX        Y        Y        N        Y        N        N        N        N
          SIX        Y        Y        N        N        N        N        N        N
          U        Y        Y        Y        N        N        N        N        N
          X        Y        N        N        N        N        N        N        N
          Z        N        N        N        N        N        N        N        N
          表五:DB2數據庫表鎖的相容矩陣
          鎖A的模式        鎖B的模式
                  S        U        X        W        NS        NX        NW
          S        Y        Y        N        N        Y        N        N
          U        Y        N        N        N        Y        N        N
          X        N        N        N        N        N        N        N
          W        N        N        N        N        N        N        Y
          NS        Y        Y        N        N        Y        Y        Y
          NX        N        N        N        N        Y        N        N
          NW        N        N        N        Y        Y        N        N
          表六:DB2數據庫行鎖的相容矩陣
          下表是筆者總結了DB2中各SQL語句產生表鎖的情況(假設缺省的隔離級別為CS):
          SQL語句        行鎖
          模式        表鎖
          模式        允許的鎖模式
          Select * from table_name for read only with rr..        無        S        IN,IS,S,U
          Select * from table_name for read only with rs..        NS        IS        IN,IS,S,SIX,U
          Select * from table_name for read only with cs..        無        無       
          Select * from table_name for read only with ur..        無        無       
          Select * from table_name for update with rr        無        U        IN,IS,S
          Select * from table_name for update with rs        U        IX        IN,IS,IX
          Select * from table_name for update with cs        U        IX        IN,IS,IX
          Select * from table_name for update with ur        U        IX        IN,IS,IX
          Insert into table_name……        W        IX        IN,IS,IX
          Update table_name……        X        IX        IN,IS,IX
          Delete from table_name……        X        IX        IN,IS,IX
          lock table table_name in share mode        無        S        IN,IS,S,U
          lock table table_name in exclusive mode        無        X        IN
          Alter table t1 add column id int                Z       
          Drop table t1        X        Z       
          Create table t1(id int)                Z       
          注:alter,create,drop會在syscolumns,systables,systablespaces,sysuserath等數據字典系統表中加行級鎖。
          3.3        DB2鎖的升級
          每個鎖在內存中都需要一定的內存空間,為了減少鎖需要的內存開銷,DB2提供了鎖升級的功能。鎖升級是通過對表加上非意圖性的表鎖,同時釋放行鎖來減少鎖的數目,從而達到減少鎖需要的內存開銷的目的。鎖升級是由數據庫管理器自動完成的,有兩個數據庫的配置參數直接影響鎖升級的處理:
          locklist—在一個數據庫全局內存中用于鎖存儲的內存。單位為頁(4K)。
          maxlocks—一個應用程序允許得到的鎖占用的內存所占locklist大小的百分比。
          鎖升級會在這兩種情況下被觸發:
          ?        某個應用程序請求的鎖所占用的內存空間超出了maxlocks與locklist的乘積大小。這時,數據庫管理器將試圖通過為提出鎖請求的應用程序申請表鎖,并釋放行鎖來節省空間。
          ?        在一個數據庫中已被加上的全部鎖所占的內存空間超出了locklist定義的大小。這時,數據庫管理器也將試圖通過為提出鎖請求的應用程序申請表鎖,并釋放行鎖來節省空間。
          鎖升級是有可能會失敗的,比如,現在一個應用程序已經在一個表上加有IX鎖,表中的某些行上加有X鎖,另一個應用程序又來請求表上的IS鎖,以及很多行上的S鎖,由于申請的鎖數目過多引起鎖的升級。數據庫管理器試圖為該應用程序申請表上的S鎖來減少所需要的鎖的數目,但S鎖與表上原有的IX鎖沖突,鎖升級不能成功。
               如果鎖升級失敗,引起鎖升級的應用程序將接到一個-912的SQLCODE。

          posted on 2007-04-08 12:32 carry 閱讀(1266) 評論(0)  編輯  收藏 所屬分類: 數據庫


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


          網站導航:
           
          主站蜘蛛池模板: 光泽县| 柏乡县| 汉中市| 常州市| 杭锦旗| 衡南县| 馆陶县| 佛教| 大同县| 高平市| 密山市| 桓台县| 邳州市| 富锦市| 广河县| 晋宁县| 资溪县| 大石桥市| 肃南| 普宁市| 磴口县| 会同县| 山东| 延津县| 庆城县| 太湖县| 三台县| 突泉县| 商河县| 康定县| 运城市| 龙口市| 南澳县| 旬阳县| 丰宁| 昭苏县| 桃园市| 湟中县| 会理县| 泸溪县| 宝应县|