隨筆 - 6, 文章 - 0, 評論 - 0, 引用 - 0
          數(shù)據(jù)加載中……

          DB2鎖介紹[轉(zhuǎn)]

          3        DB2 多粒度封鎖機制介紹
          3.1        鎖的對象
          DB2支持對表空間、表、行和索引加鎖(大型機上的數(shù)據(jù)庫還可以支持對數(shù)據(jù)頁加鎖)來保證數(shù)據(jù)庫的并發(fā)完整性。不過在考慮用戶應(yīng)用程序的并發(fā)性的問題上,通常并不檢查用于表空間和索引的鎖。該類問題分析的焦點在于表鎖和行鎖。
          3.2        鎖的策略
          DB2可以只對表進行加鎖,也可以對表和表中的行進行加鎖。如果只對表進行加鎖,則表中所有的行都受到同等程度的影響。如果加鎖的范圍針對于表及下屬的行,則在對表加鎖后,相應(yīng)的數(shù)據(jù)行上還要加鎖。究竟應(yīng)用程序是對表加行鎖還是同時加表鎖和行鎖,是由應(yīng)用程序執(zhí)行的命令和系統(tǒng)的隔離級別確定。
          3.2.1        DB2表鎖的模式
          DB2在表一級加鎖可以使用以下加鎖方式:
          名稱縮寫        全名        描述
          IN        無意圖鎖 (Intenet None)
          不需要行鎖        該鎖的擁有者可以讀表中的任何數(shù)據(jù),包括其他事務(wù)尚未提交的數(shù)據(jù),但不能對表中的數(shù)據(jù)進行更改。
          IS        意圖共享鎖(Intent Share)需要行鎖配合        該鎖的擁有者在擁有相應(yīng)行的上的S鎖時可以讀取該行的數(shù)據(jù)。但不能對表中的數(shù)據(jù)進行更改。
          IX        意圖排它鎖(Intent eXclusive)需要行鎖配合        該鎖的擁有者在擁有相應(yīng)行的X鎖時可以更改該行的數(shù)據(jù)。
          SIX        共享攜意圖排它鎖
          (Share with Intent exclusive)需要行鎖配合        鎖的擁有者可以讀表中的任何數(shù)據(jù),如果在相應(yīng)的行上能夠獲得X鎖,則可以修改該行。SIX鎖的獲得比較特殊,它是在應(yīng)用程序已經(jīng)擁有IX鎖的情況下請求S鎖或者是在應(yīng)用程序已經(jīng)擁有S鎖的情況下請求IX鎖時生成的。
          S        共享鎖(Share)不需要行鎖配合        鎖的擁有者可以讀表中的任何數(shù)據(jù),如果表上被加上S鎖,該表中的數(shù)據(jù)就只能被讀取,不能被改變。
          U        更新鎖(Update)
          不需要行鎖配合        鎖的擁有者可以讀表中的任何數(shù)據(jù),如果在升級到X鎖之后,可以更改表中的任何數(shù)據(jù)。該鎖是處于等待對數(shù)據(jù)進行更改的一種中間狀態(tài)。
          X        排它鎖
          (eXclusive)
          不需要行鎖配合        鎖的擁有者可以讀取或更改表中的任何數(shù)據(jù)。如果對表加上X鎖,除了未提交讀程序,其他應(yīng)用程序都不能對該表進行存取。
          Z        超級排它鎖
          (Super Exclusive)
          不需要行鎖配合        該鎖不是通過應(yīng)用程序中的DML語言來生成的。一般是通過對表進行刪除(Drop)和轉(zhuǎn)換(Alter)操作或創(chuàng)建和刪除索引而獲得的。如果對表上加上Z鎖,其他應(yīng)用程序,包括未提交讀程序都不能對該表進行存取。
          表三:DB2數(shù)據(jù)庫表鎖的模式
          下面對幾種表鎖的模式進一步加以闡述:
            IS、IX、SIX方式用于表一級并需要行鎖配合,他們可以阻止其他應(yīng)用程序?qū)υ摫砑由吓潘i。
          ?        如果一個應(yīng)用程序獲得某表的IS鎖,該應(yīng)用程序可獲得某一行上的S鎖,用于只讀操作,同時其他應(yīng)用程序也可以讀取該行,或是對表中的其他行進行更改。
          ?        如果一個應(yīng)用程序獲得某表的IX鎖,該應(yīng)用程序可獲得某一行上的X鎖,用于更改操作,同時其他應(yīng)用程序可以讀取或更改表中的其他行。
          ?        如果一個應(yīng)用程序獲得某表的SIX鎖,該應(yīng)用程序可以獲得某一行上的X鎖,用于更改操作,同時其他應(yīng)用程序只能對表中其他行進行只讀操作。
          S、U、X和Z方式用于表一級,但并不需要行鎖配合,是比較嚴格的表加鎖策略。
          ?        如果一個應(yīng)用程序得到某表的S鎖。該應(yīng)用程序可以讀表中的任何數(shù)據(jù)。同時它允許其他應(yīng)用程序獲得該表上的只讀請求鎖。如果有應(yīng)用程序需要更改讀該表上的數(shù)據(jù),必須等S鎖被釋放。
          ?        如果一個應(yīng)用程序得到某表的U鎖,該應(yīng)用程序可以讀表中的任何數(shù)據(jù),并最終可以通過獲得表上的X鎖來得到對表中任何數(shù)據(jù)的修改權(quán)。其他應(yīng)用程序只能讀取該表中的數(shù)據(jù)。U鎖與S鎖的區(qū)別主要在于更改的意圖上。U鎖的設(shè)計主要是為了避免兩個應(yīng)用程序在擁有S鎖的情況下同時申請X鎖而造成死鎖的。
          ?        如果一個應(yīng)用程序得到某表上的X鎖,該應(yīng)用程序可以讀或修改表中的任何數(shù)據(jù)。其他應(yīng)用程序不能對該表進行讀或者更改操作。
          ?        如果一個應(yīng)用程序得到某表上的Z鎖,該應(yīng)用程序可以讀或修改表中的任何數(shù)據(jù)。其他應(yīng)用程序,包括未提交讀程序都不能對該表進行讀或者更改操作。
          IN鎖用于表上以允許未提交讀這一概念。
          3.2.2        DB2行鎖的模式
          除了表鎖之外,DB2還支持以下幾種方式的行鎖。
          名稱縮寫        全名        需要表鎖的最低級別        描述
          S        共享鎖
          (Share)        IS        該行正在被某個應(yīng)用程序讀取,其他應(yīng)用程序只能對該行進行讀操作。
          U        更改鎖
          (Update)        IX        某個應(yīng)用程序正在讀該行并有可能更改該行,其他應(yīng)用程序只能讀該行。
          X        排它鎖
          (eXclusive)        IX        該行正在被某個應(yīng)用程序更改,其他應(yīng)用程序不能訪問該行。
          W        弱排它鎖
          (Weak eXclusive)        IX        當(dāng)一行數(shù)據(jù)被插入表中的時候,該行上會被加上W鎖。鎖的擁有者能夠更改該行,該鎖基本與X鎖相同,除了它與NW鎖兼容。
          NS        下一鍵共享鎖
          (Next Key Share)        IS        鎖的擁有者和其他程序都可以讀該行,但不能對該行進行更改。當(dāng)應(yīng)用程序處于RS或CS隔離級下,該鎖用來替代S鎖。
          NX        下一鍵排它鎖
          (Next Key eXclusive)        IX        當(dāng)一行數(shù)據(jù)被插入到索引中或從索引中被刪除的時候,該行的下一行上會被加上該鎖。鎖的擁有者可以讀,但不能更改鎖定行。該鎖與X鎖類似,只是與NS鎖兼容。
          NW        下一鍵弱排它鎖
          (Next Key Weak eXclusive)        IX        當(dāng)一行被插入到索引中的時候,該行的下一行會被加上該鎖。鎖的擁有者可以讀但不能更改鎖定行。該鎖與X和NX鎖類似,只是與W和NS鎖兼容。
          表四:DB2數(shù)據(jù)庫行鎖的模式
          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數(shù)據(jù)庫表鎖的相容矩陣
          鎖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數(shù)據(jù)庫行鎖的相容矩陣
          下表是筆者總結(jié)了DB2中各SQL語句產(chǎn)生表鎖的情況(假設(shè)缺省的隔離級別為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等數(shù)據(jù)字典系統(tǒng)表中加行級鎖。
          3.3        DB2鎖的升級
          每個鎖在內(nèi)存中都需要一定的內(nèi)存空間,為了減少鎖需要的內(nèi)存開銷,DB2提供了鎖升級的功能。鎖升級是通過對表加上非意圖性的表鎖,同時釋放行鎖來減少鎖的數(shù)目,從而達到減少鎖需要的內(nèi)存開銷的目的。鎖升級是由數(shù)據(jù)庫管理器自動完成的,有兩個數(shù)據(jù)庫的配置參數(shù)直接影響鎖升級的處理:
          locklist—在一個數(shù)據(jù)庫全局內(nèi)存中用于鎖存儲的內(nèi)存。單位為頁(4K)。
          maxlocks—一個應(yīng)用程序允許得到的鎖占用的內(nèi)存所占locklist大小的百分比。
          鎖升級會在這兩種情況下被觸發(fā):
          ?        某個應(yīng)用程序請求的鎖所占用的內(nèi)存空間超出了maxlocks與locklist的乘積大小。這時,數(shù)據(jù)庫管理器將試圖通過為提出鎖請求的應(yīng)用程序申請表鎖,并釋放行鎖來節(jié)省空間。
          ?        在一個數(shù)據(jù)庫中已被加上的全部鎖所占的內(nèi)存空間超出了locklist定義的大小。這時,數(shù)據(jù)庫管理器也將試圖通過為提出鎖請求的應(yīng)用程序申請表鎖,并釋放行鎖來節(jié)省空間。
          鎖升級是有可能會失敗的,比如,現(xiàn)在一個應(yīng)用程序已經(jīng)在一個表上加有IX鎖,表中的某些行上加有X鎖,另一個應(yīng)用程序又來請求表上的IS鎖,以及很多行上的S鎖,由于申請的鎖數(shù)目過多引起鎖的升級。數(shù)據(jù)庫管理器試圖為該應(yīng)用程序申請表上的S鎖來減少所需要的鎖的數(shù)目,但S鎖與表上原有的IX鎖沖突,鎖升級不能成功。
               如果鎖升級失敗,引起鎖升級的應(yīng)用程序?qū)⒔拥揭粋€-912的SQLCODE。

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 柳林县| 广安市| 囊谦县| 梅州市| 项城市| 克什克腾旗| 明溪县| 治县。| 塘沽区| 玉田县| 新乡县| 江孜县| 旅游| 平阴县| 潼南县| 肃南| 高阳县| 波密县| 平顶山市| 长岭县| 绍兴县| 临猗县| 襄垣县| 仁怀市| 商丘市| 开化县| 营口市| 庆阳市| 扬中市| 博客| 乐至县| 星子县| 于田县| 武定县| 张家港市| 三台县| 徐水县| 永嘉县| 织金县| 札达县| 宣汉县|