基本鎖型別有兩種:排他鎖(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鎖,則其它任何事務都不...