Oracle多粒度封鎖機制研究1

jss001發表於2009-03-01

1 引言—資料庫鎖的基本概念

為了確保併發使用者在存取同一資料庫物件時的正確性(即無丟失修改、可重複讀、不讀“髒”資料),資料庫中引入了鎖機制。基本的鎖型別有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。

排它鎖:若事務T對資料DX鎖,則其它任何事務都不能再對D加任何型別的鎖,直至T釋放D上的X鎖;一般要求在修改資料前要向該資料加排它鎖,所以排它鎖又稱為寫鎖

共享鎖:若事務T對資料DS鎖,則其它事務只能對DS鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取資料前要向該資料加共享鎖,所以共享鎖又稱為讀鎖

2 Oracle多粒度封鎖機制介紹

根據保護物件的不同,Oracle資料庫鎖可以分為以下幾大類:

(1) DML lock,資料鎖):用於保護資料的完整性;

(2) DDL lockdictionary locks,字典鎖):用於保護資料庫物件的結構(例如表、檢視、索引的結構定義);

(3) internal locksl a t c h es(內部鎖與閂):保護內部資料庫結構;

(4) distributed locks(分散式鎖):用於OPS(並行伺服器)中;

(5) PCM locks(並行快取記憶體管理鎖):用於OPS(並行伺服器)中。

本文主要討論DML(也可稱為data locks,資料鎖)鎖。從封鎖粒度(封鎖物件的大小)的角度看,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。

2.1 OracleTX鎖(行級鎖、事務鎖)

許多對Oracle不太瞭解的技術人員可能會以為每一個TX鎖代表一條被封鎖的資料行,其實不然。TX的本義是Transaction(事務),當一個事務第一次執行資料更改(InsertUpdateDelete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMITROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應多個被該事務鎖定的資料行。

Oracle的每行資料上,都有一個標誌位來表示該行資料是否被鎖定。Oracle不象其它一些DBMS(資料庫管理系統)那樣,建立一個連結串列來維護每一行被加鎖的資料,這樣就大大減小了行級鎖的維護開銷,也在很大程度上避免了其它資料庫系統使用行級封鎖時經常發生的鎖數量不夠的情況。資料行上的鎖標誌一旦被置位,就表明該行資料被加X鎖,Oracle在資料行上沒有S鎖。

2.2 TM鎖(表級鎖)

2.2.1 意向鎖的引出

表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的資料很多,逐行檢查鎖標誌的開銷將很大,系統的效能將會受到影響。為了解決這個問題,可以在表級引入新的鎖型別來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。

意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對錶加鎖時,就不再需要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提高。

2.2.2 意向鎖的型別

由兩種基本的鎖型別(S鎖、X鎖),可以自然地派生出兩種意向鎖:

意向共享鎖Intent Share Lock,簡稱IS鎖):如果要對一個資料庫物件加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖;

意向排它鎖Intent Exclusive Lock,簡稱IX鎖):如果要對一個資料庫物件加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。

另外,基本的鎖型別(SX)與意向鎖型別(ISIX)之間還可以組合出新的鎖型別,理論上可以組合出4種,即:S+ISS+IXX+ISX+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=SX+IS=XX+IX=X,這裡的“=”指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。

這樣我們又可以引入一種新的鎖的型別

共享意向排它鎖Shared Intent Exclusive Lock,簡稱SIX鎖):如果對一個資料庫物件加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。

這樣資料庫物件上所加的鎖型別就可能有5種:即SXISIXSIX

具有意向鎖的多粒度封鎖方法中任意事務T要對一個資料庫物件加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷。

2.2.3 OracleTM鎖(表級鎖)

OracleDML鎖(資料鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)型別共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的SXISIXSIX相對應。需要注意的是,由於Oracle在行級只提供X鎖,所以與RS鎖(透過SELECT … FOR UPDATE語句獲得)對應的行級鎖也是X鎖(但是該行資料實際上還沒有被修改),這與理論上的IS鎖是有區別的。

下表為Oracle資料庫TM鎖的相容矩陣(Y=Yes,表示相容的請求;N=No,表示不相容的請求;-表示沒有加鎖請求):

T2

T1

S

X

RS

RX

SRX

-

S

Y

N

Y

N

N

Y

X

N

N

N

N

N

Y

RS

Y

N

Y

Y

Y

Y

RX

N

N

Y

Y

N

Y

SRX

N

N

Y

N

N

Y

-

Y

Y

Y

Y

Y

Y

表一:Oracle資料庫TM鎖的相容矩陣

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1016706/,如需轉載,請註明出處,否則將追究法律責任。

相關文章