oracle資料庫鎖的概念

2021-08-29 19:16:17 字數 4495 閱讀 4360

為了確保併發使用者在訪問同一資料庫物件時的正確性(即無丟失修改、可重複讀、不讀

「髒」資料),資料庫中引入了鎖機制。基本的鎖型別有兩種:排它鎖(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 要對乙個資料庫物件加鎖,必須先對它的

上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次

序進行;具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷。

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,表示不相

容的請求;-表示沒有加鎖請求):

t2t1

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 多粒度封鎖機制的監控。

oracle資料庫概念

oracle由兩個主要元件構成,例項和資料庫.例項元件是啟動初始化的一組作業系統程序和記憶體結構 資料庫元件是指的用於資料儲存和資料庫操作的物理檔案。1.oracle提供了許多可在與資料庫互動時使用的工具,最常見的有 用於安裝和刪除的oracle軟體oui oracle universal inst...

檢視oracle資料庫鎖

方法一 檢視產生鎖的程序id 在資料庫伺服器上 主機 如應用伺服器 等等 select s.machine sourse host,p.spid pid,l.session id sid,s.serial l.locked mode,l.oracle username,s.user l.os use...

Oracle資料庫的鎖型別

oracle 中的鎖 鎖是資料庫用來控制共享資源併發訪問的機制。鎖用於保護正在被修改的資料 直到提交或回滾了事務之後,其他使用者才可以更新資料 鎖的特性 一致性 一次只允許乙個使用者修改資料 完整性 為所有使用者提供正確的資料。如果乙個使用者進行了修改並儲存,所做的修改將反映給所有使用者 並行性 允...