Oracle多粒度封鎖機制研究(zt)
1 引言—資料庫鎖的基本概念
為了確保併發使用者在存取同一資料庫物件時的正確性(即無丟失修改、可重複讀、不讀“髒”資料),資料庫中引入了鎖機制。基本的鎖型別有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。
排它鎖:若事務T對資料D加X鎖,則其它任何事務都不能再對D加任何型別的鎖,直至T釋放D上的X鎖;一般要求在修改資料前要向該資料加排它鎖,所以排它鎖又稱為寫鎖。
共享鎖:若事務T對資料D加S鎖,則其它事務只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取資料前要向該資料加共享鎖,所以共享鎖又稱為讀鎖。
2 Oracle 多粒度封鎖機制介紹
根據保護物件的不同,Oracle資料庫鎖可以分為以下幾大類:
(1) DML lock,資料鎖):用於保護資料的完整性;
(2) DDL lock(dictionary locks,字典鎖):用於保護資料庫物件的結構(例如表、檢視、索引的結構定義);
(3) internal locks 和l a t c h es(內部鎖與閂):保護內部資料庫結構;
(4) distributed locks(分散式鎖):用於OPS(並行伺服器)中;
(5) PCM locks(並行快取記憶體管理鎖):用於OPS(並行伺服器)中。
本文主要討論DML(也可稱為data locks,資料鎖)鎖。從封鎖粒度(封鎖物件的大小)的角度看,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。
2.1 Oracle的TX鎖(行級鎖、事務鎖)
許多對Oracle不太瞭解的技術人員可能會以為每一個TX鎖代表一條被封鎖的資料行,其實不然。TX的本義是Transaction(事務),當一個事務第一次執行資料更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個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鎖。
另外,基本的鎖型別(S、X)與意向鎖型別(IS、IX)之間還可以組合出新的鎖型別,理論上可以組合出4種,即:S+IS,S+IX,X+IS,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要對一個資料庫物件加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷。
2.2.3 Oracle的TM鎖(表級鎖)
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 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鎖的相容矩陣
一方面,當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…… | RX | RS、RX |
Update table_name…… | RX | RS、RX |
Delete from table_name…… | RX | RS、RX |
Select * from table_name for update | RS | RS、RX、S、SRX |
lock table table_name in row share mode | RS | RS、RX、S、SRX |
lock table table_name in row exclusive mode | RX | RS、RX |
lock table table_name in share mode | S | RS、S |
lock table table_name in share row exclusive mode | SRX | RS |
lock table table_name in exclusive mode | X | 無 |
表二:Oracle資料庫TM鎖小結
我們可以看到,通常的DML操作(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;另外,Oracle資料庫的一個顯著特點是,在預設情況下,單純地讀資料(SELECT)並不加鎖,Oracle透過回滾段(Rollback segment)來保證使用者不讀“髒”資料。這些都極大地提高了系統的併發程度。
由於意向鎖及資料行上鎖標誌位的引入,極大地減小了Oracle維護行級鎖的開銷,這些技術的應用使Oracle能夠高效地處理高度併發的事務請求。
3 Oracle 多粒度封鎖機制的監控
3.1 系統檢視介紹
為了監控Oracle系統中鎖的狀況,我們需要對幾個系統檢視有所瞭解:
3.1.1 v$lock檢視
v$lock檢視列出當前系統持有的或正在申請的所有鎖的情況,其主要欄位說明如下:
欄位名稱 | 型別 | 說明 |
SID | NUMBER | 會話(SESSION)標識; |
TYPE | VARCHAR(2) | 區分該鎖保護物件的型別; |
ID1 | NUMBER | 鎖標識1; |
ID2 | NUMBER | 鎖標識2; |
LMODE | NUMBER | 鎖模式:0(None),1(null),2(row share), 3(row exclusive 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84413/,如需轉載,請註明出處,否則將追究法律責任。
請登入後發表評論
登入
全部評論
|
相關文章
- Oracle多粒度封鎖機制研究二(zt)Oracle
- Oracle多粒度封鎖機制研究2Oracle
- Oracle多粒度封鎖機制研究1Oracle
- oracle鎖機制研究Oracle
- Oracle資料庫資料鎖機制解析(zt)Oracle資料庫
- Oracle鎖機制Oracle
- oracle 鎖機制Oracle
- Oracle SCN機制解析(zt)Oracle
- ZT Oracle SCN機制解析Oracle
- zt_oracle undo機制Oracle
- MySQL鎖(樂觀鎖、悲觀鎖、多粒度鎖)MySql
- ORACLE鎖機制-轉載Oracle
- oracle中的鎖機制Oracle
- ORACLE DML鎖定機制Oracle
- ORACLE鎖機制深入理解Oracle
- ORACLE鎖的管理(zt)Oracle
- JAVA多執行緒與鎖機制Java執行緒
- ORACLE 鎖機制及解決方法Oracle
- 深入淺出oracle鎖(ZT)Oracle
- oracle封鎖測試Oracle
- Java多執行緒4:synchronized鎖機制Java執行緒synchronized
- zt_oracle shared pool分配機制_4031Oracle
- ORACLE 資料庫中的鎖機制Oracle資料庫
- oracle的鎖和並行機制薦Oracle並行
- Oracle的鎖機制歸納總結Oracle
- zt_Oracle Library cache 內部機制 說明Oracle
- PHP 鎖機制PHP
- SQLite鎖機制SQLite
- Mysql鎖機制MySql
- java鎖機制Java
- SQL鎖機制SQL
- oracle deadlock 之(一)--鎖機制介紹Oracle
- Oracle回收站表閃回機制研究Oracle
- Java 細粒度鎖續篇Java
- Oracle資料庫封鎖和select...[for update [of tab.col]]的研究Oracle資料庫
- 轉貼:Oracle的鎖機制歸納總結Oracle
- Mysql鎖機制分析MySql
- Enqueue 鎖定機制ENQ