Oracle多粒度鎖機制

2021-05-22 11:40:19 字數 3917 閱讀 9661

基本鎖型別有兩種:排他鎖(exclusive locks)記為x鎖 , 共享鎖(share locks)記為s鎖。

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

共享鎖:若事務t對資料d加s鎖,則其他事務只能對d加s鎖,而不能加x鎖,直至t釋放d上的s鎖;一般要求在讀取資料前要向該資料加共享鎖,所以共享鎖又稱為讀鎖

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

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

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

(3)internal locks 和 latche(內部鎖和閂):保護內部資料庫結構;

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

(5)pcm locks(並行快取記憶體管理鎖):用於ops(並行伺服器)中;

dml(也可稱為data locks,資料鎖)鎖。從封鎖粒度(封鎖物件的大小)的角度看,oracle dml鎖共有兩個層次,即行級鎖和表級鎖。

tx的本義是transaction(事務),當乙個事務第一次執行資料修改(insert,update,delete)或使用select...for update語句進行查詢時,它即獲得乙個tx(事務)鎖,直至該事務結束(執行commit或rollback操作)時,該鎖才被釋放。所以乙個tx鎖,可以對應多個被該事務鎖定的資料行。

在oracle資料行上,都有乙個標誌位來表示該行資料是否被鎖定。資料行上的鎖標誌一旦被置位,就表明該資料行被加x鎖,oracle在資料行上沒有s鎖。

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

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

由兩種基本的鎖型別(s鎖,x鎖),可以自然地派生出兩種意向鎖。

意向共享鎖(intent share lock ,簡稱is鎖):如果要對乙個資料庫物件加s鎖,首先要對其上節點加is鎖,表示它的後裔節點擬(意向)加s鎖。

意向排他鎖(intent exclusive lock,簡稱ix鎖):如果要對乙個資料庫物件加x鎖,首先要對其上節點加ix鎖,表示它的後裔節點擬(意向)加x鎖。

另外,基本的鎖型別(s,x)與意向鎖型別(is,ix)之間還可以組合出新的鎖型別,理論上可以組合出四種,即s+is, s+ix, x+ix, x+ix, 但稍微分析不難看出,實際上只有s+ix有新的意義,其他三種組合都沒有是鎖的強度提高(即:s+is=s,x+is=x,x+ix=x,這裡的「=」指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度

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

共享意向排他鎖(shared intent exclusive lock,簡稱six鎖):如果對乙個資料庫物件加six鎖,表示對它加s鎖,再加ix鎖,即six = s + ix。例如:事務對某個表加six鎖,則表示該事務要讀整個表(所以要對錶加s鎖),同時會更新個別行(所以要對該錶加ix鎖)。

這樣資料庫物件上所能加的鎖型別就有5種:即s,x,is,ix,six。

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

oracle的dml鎖(資料鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即x鎖),但其tm鎖(表級鎖)型別共有5種,分別為共享鎖(s鎖)、排它鎖(x鎖)、行級共享鎖(rs鎖)、行級排它鎖(rx鎖)、共享行級排它鎖(srx鎖),與上面提到的s、x

、is、ix

、six

相對應。

需要注意的是,由於oracle在行級只提供x鎖,所以與rs鎖(通過select … for update

語句獲得)對應的行級鎖也是

x鎖(但是該行資料實際上還沒有被修改),這與理論上的

is鎖是有區別的。

下表為oracle資料庫tm鎖的相容矩陣(y=yes,表示相容的請求; n=no,表示不相容的請求;-表示沒有加鎖請求): t2

t1sxrs

rxsrx-s

ynyn

nyxn

nnnn

yrsyn

yy y

yrxn

nyyn

ysrxnn

ynny

-yyy

yyy

表一:oracle

資料庫tm

鎖的相容矩陣

一方面,當oracle執行select…for update、insert、update、delete等dml語句時,系統自動在所要操作的表上申請表級rs鎖(select…for update)或rx鎖(insert、update、delete),當表級鎖獲得後,系統再自動申請tx鎖,並將實際鎖定的資料行的鎖標誌位置位(指向該tx鎖);另一方面,程式或操作人員也可以通過lock table語句來指定獲得某種型別的tm鎖。下表總結了oracle中各sql語句產生tm鎖的情況:

sql語句

表鎖模式

允許的鎖模式

select * from table_name……無

rs、rx、s、srx、x

insert into table_name……

rxrs、rx

update table_name……

rxrs、rx

delete from table_name……

rxrs、rx

select * from table_name for update

rsrs、rx、s、srx

lock table table_name in row share mode

rsrs、rx、s、srx

lock table table_name in row exclusive mode

rxrs、rx

lock table table_name in share mode

srs、s

lock table table_name in share row exclusive mode

srxrs

lock table table_name in exclusive modex無

表二:oracle

資料庫tm

鎖小結

我們可以看到,通常的dml操作(select…for update、insert、update、delete),在表級獲得的只是意向鎖(rs或rx),其真正的封鎖粒度還是在行級;另外,oracle資料庫的乙個顯著特點是,在預設情況下,單純地讀資料(select)並不加鎖,oracle通過回滾段(rollback segment)來保證使用者不讀「髒」資料。這些都極大地提高了系統的併發程度。

由於意向鎖及資料行上鎖標誌位的引入,極大地減小了oracle維護行級鎖的開銷,這些技術的應用使oracle能夠高效地處理高度併發的事務請求。

oracle多粒度鎖機制

1.資料庫鎖的概念 為了確保併發使用者在訪問同一資料庫物件時的正確性 即無丟失修改 可重複讀 不讀 髒 資料 資料庫中引入了鎖機制。基本的鎖型別有兩種 排它鎖 exclusive locks 記 為x 鎖 和共享鎖 share locks記為 s鎖 排它鎖 若事務t對資料d加x鎖,則其它任何事務都不...

Oracle 多粒度封鎖機制的監控

oracle 多粒度封鎖機制的監控 為了監控oracle系統中鎖的狀況,我們需要對幾個系統檢視有所了解 5.1 v lock檢視 v lock檢視列出當前系統持有的或正在申請的所有鎖的情況,其主要字段說明如下 表七 v lock檢視主要字段說明 其中在type欄位的取值中,本文只關心tm tx兩種d...

通過意向鎖多粒度封鎖機制進行併發控制

1.資料庫鎖的概念 為了確保併發使用者在訪問同一資料庫物件時的正確性 即無丟失修改 可重複讀 不讀 髒 資料 資料庫中引入了鎖機制。基本的鎖型別有兩種 排它鎖 exclusive locks 記 為x 鎖 和共享鎖 share locks記為 s鎖 排它鎖 若事務t對資料d加x鎖,則其它任何事務都不...