當前位置:成語大全網 - 新華字典 - oracle--對鎖機制的理解-

oracle--對鎖機制的理解-

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(data locks,數據鎖):用於保護數據的完整性;

(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要對壹個數據庫對象加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的並發度,減少了加鎖和解鎖的開銷。