溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

sql server中意向鎖的作用是什么

發(fā)布時間:2021-08-02 17:24:00 來源:億速云 閱讀:143 作者:Leah 欄目:數(shù)據(jù)庫

本篇文章給大家分享的是有關(guān)sql server中意向鎖的作用是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

  sql server中意向鎖是什么意思

  數(shù)據(jù)庫引擎使用意向鎖來保護鎖層次結(jié)構(gòu)的底層資源,以防止其他事務(wù)對自己鎖住的資源造成傷害,提高鎖沖突檢測性能。例如,當讀取表里的頁面時,在請求頁共享鎖(S鎖)之前,事務(wù)在表級請求共享意向鎖。這樣可以防止其他事務(wù)隨后在表上獲取排他鎖(X鎖),修改整個表格。意向鎖可以提高性能,因為數(shù)據(jù)庫引擎僅在表級檢查意向鎖,確定事務(wù)是否能安全地獲取該表上的鎖,而不需要檢查表中的每行或每頁上的鎖以確定事務(wù)是否可以鎖定整個表。

  如何理解上面這句話的意思呢?我們以一個實際例子來說明。

  假如有一張Student,其中包含1000條數(shù)據(jù),測試數(shù)據(jù)如下:

  create table Student

  (

  id int,

  name char(30),

  constraint pk_id primary key(id)

  )

  --3.插入1000條記錄

  SET NOCOUNT ON;

  GO

  DECLARE @i int;

  SET @i = 1;

  WHILE @i <= 1000 BEGIN

  INSERT INTO Student values(@i,'zhangsan'+cast(@i as char))

  SET @i = @i + 1;

  END;

  GO

  因為設(shè)置了id列為主鍵,那么sql server會自動為其添加聚集索引。假如我們使用如下語句更新表中的數(shù)據(jù),

  begin tran

  UPDATE Student SET name ='zhangsan' WHERE id=1000;

  然后再查詢當前的鎖狀態(tài),執(zhí)行如下TSQL

  --查看所狀態(tài)

  SELECT request_session_id, resource_type, resource_associated_entity_id,

  request_status, request_mode, resource_description

  FROM sys.dm_tran_locks

  sql server中意向鎖的作用

  我們可以看到在Object和Page上面加了IX鎖,而在Key上面加了X鎖。

  那么在表上加一個意向排它鎖(IX)有什么用呢?假如此時有另外一個事務(wù)要求對整張表加S鎖,它需要判定能夠?qū)@張表加這個S鎖。

  如果不使用意向鎖的話,那么得遍歷Key查看是否有與S鎖沖突的鎖,而我們上面加鎖的那一條記錄剛好是最后一條,那么就得遍歷所有數(shù)據(jù)。現(xiàn)在只有1000條數(shù)據(jù)還好,數(shù)據(jù)量不大,如果是上千萬或者過億的話,那么消耗會非常大。

  如果使用意向鎖的話,我們就不需要遍歷數(shù)據(jù),我們發(fā)現(xiàn)Key上面有X鎖,那么會在表上面加一個IX鎖,而IX鎖與S鎖沖突,因此加S鎖失敗,這樣很快就得到了結(jié)果。

  鎖兼容性控制多個事務(wù)能否同時獲取同一資源上的鎖。如果資源已被另一事務(wù)鎖定,則僅當請求鎖的模式與現(xiàn)有鎖的模式相兼容時,才會授予新的鎖請求。如果請求鎖的模式與現(xiàn)有鎖的模式不兼容,則請求新鎖的事務(wù)將被迫進入等待狀態(tài),阻塞也就隨之產(chǎn)生。例如,如果一個事務(wù)申請了在某個資源上的排他鎖(X鎖),則在它釋放排他鎖(X鎖)之前,其他事務(wù)均無法獲取該資源的任何類型(共享、更新或排他)的鎖。另一種情況是,如果一個事務(wù)已經(jīng)獲得了某個資源上的共享鎖(S鎖),則即使第一個事務(wù)尚未完成,其他事務(wù)也可以獲取該項的共享鎖或更新鎖(U鎖)。但是,在第一個事務(wù)釋放共享鎖之前,其他事務(wù)無法獲取排他鎖。

  鎖的模式和兼容性是SQL Server預(yù)先定義好的,沒有任何參數(shù)或配置能夠去修改它們。但是可以通過隔離級別來控制申請鎖和釋放鎖的時機,四個隔離級別中申請與釋放S鎖時機可以參考:數(shù)據(jù)庫弱一致性四個隔離級別。但是申請鎖的粒度,是數(shù)據(jù)庫設(shè)計能夠影響的。如果應(yīng)用申請的鎖粒度都比較小,產(chǎn)生阻塞的幾率就會比較小。如果一個連接會經(jīng)常申請頁面級、表級,甚至是數(shù)據(jù)庫一級的鎖資源,程序產(chǎn)生阻塞的可能性就會很大。

以上就是sql server中意向鎖的作用是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI