天天看點

DB2 隔離級别

四、隔離級别與鎖

資料庫是利用鎖和隔離級别來共同處理資料庫的并發的。DB2資料庫用來嘗試實施并發性的方法之一是通過使用隔離級别,它決定在第一個事務通路資料時,如何對其他事務鎖定或隔離該事務所使用的資料。DB2隔離級别分為如下四種:

a、可重複讀(Repeatable Read,RR)

b、讀穩定性(Read Stability,RS)

c、遊标穩定性(Cursor Stability,CS)

d、未送出讀(Uncommitted Read,UR)

DB2預設的隔離級别為:遊标穩定性(CS)

1、可重複讀(RR -- Repeatable Read)

a、可重複讀隔離級别是最嚴格的隔離級别。在使用它時,一個事務的影響完全與其他并發事務隔離:髒讀、不可重複讀、幻像讀都不會發生。當使用可重複讀隔離級别時,在事務執行期間共享(S)鎖定該事務以任何方式引用的所有行。是以,如果在同一個事務中發出同一個SELECT語句兩次或更多次,那麼産生的結果資料集總是相同的。是以,使用可重複讀隔離級别的事務可以多次檢索同一行集,并可以對它們執行任意操作,直到由送出或復原操作終止事務。但是,在事務存在期間,不允許其他事務執行會影響該事務正在通路的任何行的插入、更新或删除操作。為了確定這種行為,鎖定該事務所引用的每一行 -- 而不是僅鎖定被實際檢索或修改的那些行。是以,如果一個表中有1000行,但隻檢索兩行,則整個表(1000行,而不僅是被檢索的兩行)都會被鎖定。

b、如果使用可重複讀隔離級别,不管從表中讀多少資料,整個表上都加S鎖,直到該事務被送出或復原,表上的鎖才會被釋放。這樣可以保證在一個事務中即使多次讀取同一行,得到的值也不會改變。另外,在同一個事務中如果以同樣的搜尋标準重新打開已被處理過的遊标,那麼得到的結果集不會改變。可重複讀相對于讀穩定性而言,加鎖的範圍更大。對于讀穩定性,應用程式隻對符合要求的所有行加鎖,而對于可重複讀,應用程式将對整個表都加S鎖。

c、可重複讀(RR),不可能出現丢失更新、髒讀和幻像讀的情況;

2、讀穩定性(RS -- Read Stability)

a、讀穩定性隔離級别沒有可重複讀隔離級别那麼嚴格。讀穩定性(RS)可以防止髒讀和不可重複讀,但可能出現幻像讀。在使用這個隔離級别時,隻鎖定事務實際檢索和修改的行。是以,如果一個表有1000行,但隻檢索兩行(通過索引掃描),則隻有被檢索的兩行(而不是所掃描的1000行)被鎖定。是以,如果在同一個事務中發出同一個select語句多次,那麼每次産生的結果集可能不同。

b、與可重複讀隔離級别一樣,在讀穩定性隔離級别下運作的事務可以檢索一個行集,并可以對它們執行任意操作,直到事務終止。在這個事務存在期間,其他事務不能執行那些會影響這個事務檢索到的行集的更新或删除操作(其他事務可以更新或删除 不影響該事務檢索到的行集的資料);但是其他事務可以執行插入操作。如果插入的行與第一個事務的查詢的選擇條件比對,那麼這些行可能作為幻像出現在後續産生的結果資料集中。其他事務對其他行所作的更改,在送出之前是不可見的。

c、如果使用讀穩定性(RS)這種隔離,在一個事務中将有N+1個鎖,其中N是所有被讀取(通過索引掃描)過的行的數目,這些行上都會被加上NS鎖,在表上加1個IS鎖。這些鎖直到事務被送出或復原,才會被釋放。這樣可以保證在一個事務中即使多次讀取同一行,得到的值不不會改變。但是,使用讀穩定性,在一個事務中,如果使用同樣的搜尋标準重新打開已被處理過的遊标,那麼結果集可能改變(可能會增加某些行,這些行被稱為幻影行-Phantom)。這是因為RS不能阻止通過插入或更新操作在結果集中加入新行。

d、讀穩定性(RS),隻鎖定應用程式在工作單元中檢索的那些行。它確定在某個工作單元完成之前,在該工作單元運作期間的任何限定行讀取不被其他應用程式程序更改,且確定不會讀取由另一個應用程式所更改的任何行,直到該程序送出了這些更改。讀穩定性,不可能出現“不可重複讀”情形。

e、“讀穩定性”,其中一個目标是提供較高的并行性程度以及資料的穩定視圖。為了有助于達到此目的,優化器確定在發生鎖定更新前不擷取表級鎖定。

f、“讀穩定性”隔離級别最适用于包括下列所有特征的應用程式:

在并發環境下運作;

需要限定某些行在工作單元運作期間保持穩定;

在工作單元中不會多次發出相同的查詢,或者在同一個工作單元中發出多次查詢時,并不要求該查詢獲得相同的回答。

3、遊标穩定性(CS -- Cursor Stability)

a、遊标穩定性隔離級别,可以防止髒讀,但有可能出現不可重複讀和幻像讀。遊标穩定性隻鎖定事務聲明并打開遊标目前引用的行。

b、當使用遊标穩定性隔離級别時,事務通過遊标從表中檢索行時,其他事務不能更新或删除遊标所引用的行。但是,如果被鎖定的行本身不是用索引通路的,那麼其他事務可以将新的行添加到表中,以及對被遊标鎖定行前後的行進行更新和删除操作。所擷取的鎖一直有效,直到遊标重定位或事務終止為止(如果遊标重定位,原來行上的鎖就被釋放,并獲得遊标現在引用的行上的鎖)。此外,如果事務修改了它檢索到的任何行,那麼在事務終止之前,其他事務不能更新或删除改行,即使遊标不再位于被修改的行。例如:一個表中有1000行資料,我們隻檢索其中的兩行資料,那麼對于可重複讀(RR)隔離級别會鎖住整個表;讀穩定性(RS)會對讀到的資料(兩行)加鎖;遊标穩定性(CS)隔離級别隻對遊标目前所在的那一行加鎖,遊标所在行的前一行和下一行都不加鎖。

c、結果集中隻有正在被讀取的那一行(遊标指向的行)将被加上NS鎖,在表上加IS鎖。其他未被處理的行上不被加鎖。CS隻能保證正在被處理的行的值不會被其他并發的程式所改變。

d、當在行上定位遊标時,遊标穩定性CS會鎖定任何由應用程式的事務所通路的行。此鎖定在讀取下一行或終止事務之前有效。但是,如果更改了某一行上的任何資料,那麼在對資料庫送出更改之前必須挂起該鎖定。

e、對于具有“遊标穩定性”的應用程式已檢索的行,當該行上有任何可更新的遊标時,任何其他應用程式都不能更新或删除該行。“遊标穩定性”應用程式不能檢視其他應用程式的未送出更改。

f、與可重複讀(RR)和讀穩定性(RS)隔離級别一樣,其他事務在其他行上進行的更改,在這些更改送出之前對使用遊标穩定性(CS)隔離級别的事務(這時預設的隔離級别)來說是不可見的。

g、遊标穩定性,可能會出現不可重複讀和幻像讀現象。

4、未送出讀(UR - Uncommitted Read)

a、未送出讀隔離級别是最不嚴格的隔離級别。實際上,在使用這個隔離級别時,僅當另一個事務試圖删除或更改被檢索的行所在表時,才會鎖定這個事務檢索的行。因為在使用這種隔離級别時,行通常保持未鎖定狀态,使用髒讀、不可重複讀和幻像讀都可能會發生。是以,未送出讀通常用于通路隻讀表和視圖的事務,以及某些執行select語句的事務。

b、未送出讀UR,運作應用程式讀取其他事務未落實的更改。但是對于隻讀和可更新兩種不同的遊标類型而言,UR的工作方式有所不同。對于可更新的遊标,當它使用隔離級别UR運作程式時,應用程式會自動使用隔離級别CS。

c、使用UR,對于隻讀操作,不加行鎖。典型的隻讀操作包括:SELECT語句的結果集隻讀(比如語句中包括ORDER BY子句);定義遊标時指明FOR FETCH ONLY或FOR READ ONLY。

d、UR,最大程度上允許并發;若需讀取未送出的資料,該隔離級别是唯一選擇。

e、隻讀遊标可通路大多數其他事務的未送出的更改。但是,當該事務正在處理時,不能使用正由其他事務建立或删除的表、視圖和索引。其他事務的任何其他更改在送出或復原前都可被讀取。

5、隔離級别的讀取總結

髒讀 不可重複 讀幻像讀

可重複讀(RR) 否 否 否

讀穩定性(RS) 否 否 是

遊标穩定性(CS) 否 是 是

未送出讀(UR) 是 是 是

6、名詞解釋:

a、髒讀又稱無效資料的讀出,是指在資料庫通路中,事務T1将某一值修改,然後事務T2讀取該值,此後T1因為某種原因撤銷對該值的修改,這就導緻了T2所讀取到的資料是無效的。髒讀就是指當一個事務正在通路資料,并且對資料進行了修改,而這種修改還沒有送出到資料庫中,這時,另外一個事務也通路這個資料,然後使用了這個資料。因為這個資料是還沒有送出的資料,那麼另外一個事務讀到的這個資料是髒資料,依據髒資料所做的操作可能是不正确的。

b、幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,比如這種修改涉及到表中的“全部資料行”。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入“一行新資料”。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖RangeS,鎖定檢鎖範圍為隻讀,這樣就避免了幻讀。 

c、不可重複讀,是指在資料庫通路中,一個事務範圍内兩個相同的查詢卻傳回了不同資料。這是由于查詢時系統中其他事務修改的送出而引起的。比如事務T1讀取某一資料,事務T2讀取并修改了該資料,T1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

繼續閱讀