意向鎖
資料庫引擎使用意向鎖來保護鎖層次結構的底層資源,以防止其他事務對自己鎖住的資源造成傷害,提高鎖衝突檢測效能。例如,當讀取表裡的頁面時,在請求頁共享鎖(s鎖)之前,事務在表級請求共享意向鎖。這樣可以防止其他事務隨後在表上獲取排他鎖(x鎖),修改整個**。意向鎖可以提高效能,因為資料庫引擎僅在表級檢查意向鎖,確定事務是否能安全地獲取該錶上的鎖,而不需要檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。
如何理解上面這句話的意思呢?我們以乙個實際例子來說明。
假如有一張student,其中包含1000條資料,測試資料如下:
create因為設定了id列為主鍵,那麼sql server會自動為其新增聚集索引。假如我們使用如下語句更新表中的資料,table
student
( id
int,
name
char(30
),
constraint pk_id primary
key(id))--
3.插入1000條記錄
set nocount on;go
declare
@iint
;set@i=
1;while
@i<=
1000
begin
insert
into student values(@i,'
zhangsan'+
cast(@i
aschar
))
set@i=@i
+1;
end;
go
begin然後再查詢當前的鎖狀態,執行如下tsqltran
update student set name =
'zhangsan
'where id=
1000;
--其查詢結果如下圖所示:檢視所狀態
select
request_session_id, resource_type, resource_associated_entity_id,
request_status, request_mode, resource_description
from sys.dm_tran_locks
我們可以看到在object和page上面加了ix鎖,而在key上面加了x鎖,這三種型別的鎖層次結果如下圖所示:
那麼在表上加乙個意向排它鎖(ix)有什麼用呢?假如此時有另外乙個事務要求對整張表加s鎖,它需要判定能夠對這張表加這個s鎖。
如果不使用意向鎖的話,那麼得遍歷key檢視是否有與s鎖衝突的鎖,而我們上面加鎖的那一條記錄剛好是最後一條,那麼就得遍歷所有資料。現在只有1000條資料還好,資料量不大,如果是上千萬或者過億的話,那麼消耗會非常大。
如果使用意向鎖的話,我們就不需要遍歷資料,我們發現key上面有x鎖,那麼會在表上面加乙個ix鎖,而ix鎖與s鎖衝突,因此加s鎖失敗,這樣很快就得到了結果。
鎖相容性控制多個事務能否同時獲取同一資源上的鎖。如果資源已被另一事務鎖定,則僅當請求鎖的模式與現有鎖的模式相相容時,才會授予新的鎖請求。如果請求鎖的模式與現有鎖的模式不相容,則請求新鎖的事務將被迫進入等待狀態,阻塞也就隨之產生。例如,如果乙個事務申請了在某個資源上的排他鎖(x鎖),則在它釋放排他鎖(x鎖)之前,其他事務均無法獲取該資源的任何型別(共享、更新或排他)的鎖。另一種情況是,如果乙個事務已經獲得了某個資源上的共享鎖(s鎖),則即使第乙個事務尚未完成,其他事務也可以獲取該項的共享鎖或更新鎖(u鎖)。但是,在第乙個事務釋放共享鎖之前,其他事務無法獲取排他鎖。
表9-3顯示了最常見的鎖模式的相容性。
表9-3 最常見的鎖模式相容性
現有授予模式
請求模式iss
uixsixx
意向共享(is) [wx2]是是
是是是否
共享(s)是是
是否否否
更新(u)是是
否 否否否
意向排他(ix)是否
否是否否
意向排他共享(six)是否
否否否否
排他(x)否否
否否否否
鎖的模式和相容性是sql server預先定義好的,沒有任何引數或配置能夠去修改它們。但是可以通過隔離級別來控制申請鎖和釋放鎖的時機,四個隔離級別中申請與釋放s鎖時機可以參考:資料庫弱一致性四個隔離級別。但是申請鎖的粒度,是資料庫設計能夠影響的。如果應用申請的鎖粒度都比較小,產生阻塞的機率就會比較小。如果乙個連線會經常申請頁面級、表級,甚至是資料庫一級的鎖資源,程式產生阻塞的可能性就會很大。
詳解 MySql InnoDB 中意向鎖的作用
innodb 支援多粒度鎖 multiple granularity locking 它允許行級鎖與表級鎖共存,而意向鎖就是其中的一種表鎖。需要強調一下,意向鎖是一種不與行級鎖衝突表級鎖,這一點非常重要。意向鎖分為兩種 即 意向鎖是有資料引擎自己維護的,使用者無法手動操作意向鎖,在為資料行加共享 排...
詳解 MySql InnoDB 中意向鎖的作用
innodb 支援多粒度鎖 multiple granularity locking 它允許行級鎖與表級鎖共存,而意向鎖就是其中的一種表鎖。需要強調一下,意向鎖是一種不與行級鎖衝突表級鎖,這一點非常重要。意向鎖分為兩種 事務要獲取某些行的 s 鎖,必須先獲得表的 is 鎖。select column...
意向鎖的作用
在了解innodb事務併發控制的時候,裡面提到了意向鎖 intention lock 這裡簡單做下總結 在innodb的使用場景中,裡面有實現了行鎖,具體有對行的讀鎖,寫鎖。另外,如果對乙個表作一些統一的操作,表的層面,有表層級的讀鎖,寫鎖。那這個意向鎖是幹嘛用的?我們假設乙個場景,乙個事務a正在寫...