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

2021-05-22 00:46:04 字數 3945 閱讀 8929

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 要對乙個資料庫物件加鎖,必須先對它的

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

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

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 t

意向鎖的作用

在了解innodb事務併發控制的時候,裡面提到了意向鎖 intention lock 這裡簡單做下總結 在innodb的使用場景中,裡面有實現了行鎖,具體有對行的讀鎖,寫鎖。另外,如果對乙個表作一些統一的操作,表的層面,有表層級的讀鎖,寫鎖。那這個意向鎖是幹嘛用的?我們假設乙個場景,乙個事務a正在寫...

mysql共享鎖 排他鎖 意向鎖

mysql鎖機制分為表鎖和行鎖,其中行鎖又包括了共享鎖與排他鎖。又稱為讀鎖 s鎖 當有多個事務時,多個事務對於同一資料可以共享乙個鎖,都能訪問到資料,但是其他事務只能讀不能寫。又稱為寫鎖 x鎖 當有多個事務時,排他鎖不能與其他鎖並存,乙個事務獲取了一行資料的排他鎖,其他事務就不能再獲取該行的其他鎖,...

MySQL 共享鎖 互斥鎖 意向鎖。

經常聽到資料庫的鎖機制,不同的資料庫的不同實現不同,聽多了就頭疼了,今天就把mysql的鎖整的明明白白 首先想一下為什麼我們會需要鎖,其實就是為了解決併發運算元據的,是一種控制併發的機制。樂觀鎖和悲觀鎖其實是兩種思想,用來指導實現鎖的功能的不同實現思想,在這兩種指導思想下產生了對應的鎖 我們可以對一...