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的鎖整的明明白白 首先想一下為什麼我們會需要鎖,其實就是為了解決併發運算元據的,是一種控制併發的機制。樂觀鎖和悲觀鎖其實是兩種思想,用來指導實現鎖的功能的不同實現思想,在這兩種指導思想下產生了對應的鎖 我們可以對一...