SQLServer之鎖簡介

鎖定義(Definition)

鎖定是 DBMS 將訪問限制爲多用戶環境中的行的過程。 以獨佔方式鎖定行或列,不容許其餘用戶訪問鎖定的數據,直到鎖被釋放。 這可確保兩個用戶不能同時更新行中的同一列。數據庫

鎖會從資源角度來看很高,應僅在須要時保持數據完整性。 在數據庫中的數百或數千個用戶可能會嘗試訪問的記錄每秒 — 如數據庫鏈接到 Internet,沒必要要的鎖定可能會迅速致使應用程序中的性能降低。架構

設置LockType打開以前的屬性記錄集指定打開它時,應使用哪一種類型的鎖定該提供程序。 要返回的鎖定中使用的一種開放類型的屬性中讀取記錄集對象。併發

提供程序可能不支持全部的鎖類型。 若是提供程序沒法支持請求LockType設置,它將替換爲另外一種類型的鎖定。 若要肯定在可用的實際鎖定功能記錄集對象,使用支持方法替換adUpdate和adUpdateBatch.性能

AdLockPessimistic若是不支持設置CursorLocation屬性設置爲adUseClient。 若是設置不支持的值,不會產生錯誤;最接近的支持LockType將改成使用。測試

LockType屬性爲讀/寫時記錄集打開時爲已關閉,而且是隻讀的。對象

鎖資源(Resource)

標識被鎖定資源的值。 值的格式取決於在所標識的資源類型類型列:類型值:資源值。索引

RID:格式爲 fileid:pagenumber:rid 的標識符,其中 fileid 標識包含頁的文件,pagenumber 標識包含行的頁,rid 標識頁上的特定行。 fileid 與匹配file_id中的列sys.database_files目錄視圖。進程

KEY: 數據庫引擎內部使用的十六進制數。事務

PAG:格式爲 fileid:pagenumber 的數字,其中 fileid 標識包含頁的文件,pagenumber 標識頁。ip

EXT:標識區中的第一頁的數字。 該數字的格式爲 fileid:pagenumber。

選項卡上: 沒有提供信息,由於表中已標識ObjId列。

DB: 沒有提供信息,由於在已標識的數據庫dbid列。

FIL: 文件匹配的標識符file_id中的列sys.database_files目錄視圖。

APP:被鎖定的應用程序資源的惟一標識符。 格式爲 DbPrincipleId:<爲 16 個字符的資源字符串的前兩個 ><哈希運算值 >。

MD:隨資源類型而變化。 有關詳細信息,請參閱的說明resource_description中的列sys.dm_tran_locks (TRANSACT-SQL)。

HBT:沒有提供任何信息。 使用sys.dm_tran_locks改成動態管理視圖。

AU:沒有提供任何信息。 使用sys.dm_tran_locks改成動態管理視圖。

鎖類型(鎖粒度)(Type)

鎖的粒度,是鎖所在資源的粒度。

RID :表中單個行的鎖,由行標識符 (RID) 標識。

KEY:索引內保護可串行事務中一系列鍵的鎖。

PAG:數據頁或索引頁的鎖。

EXT:對某區的鎖。

TAB:整個表(包括全部數據和索引)的鎖。

DB:數據庫的鎖。

FIL:數據庫文件的鎖。

APP:指定的應用程序資源的鎖。

MD:元數據或目錄信息的鎖。

HBT:堆或 B 樹索引的鎖。 在 SQL Server 中此信息不完整。

AU:分配單元的鎖。 在 SQL Server 中此信息不完整。

鎖模式(Mode)

當SQLServer請求一個鎖時,會選擇一個影響鎖的模式。鎖的模式決定了鎖對其餘任何鎖的兼容級別。若是一個查詢發現請求資源上的鎖和本身申請的鎖兼容,那麼查詢就能夠執行下去,但若是不兼容,查詢會被阻塞。直到所請求的資源上的鎖被釋放。

NULL:不授予對資源的訪問權限。 用做佔位符。

Sch-S:架構穩定性。 確保在任何會話持有對架構元素(例如表或索引)的架構穩定性鎖時,不刪除該架構元素。

Sch-M:架構修改。 必須由要更改指定資源架構的任何會話持有。 確保沒有其餘會話正在引用所指示的對象。

S:共享。 授予持有鎖的會話對資源的共享訪問權限。

U:更新。 指示對最終可能更新的資源獲取的更新鎖。 用於防止一種常見的死鎖,這種死鎖在多個會話鎖定資源以便稍後對資源進行更新時發生。

X:排他。 授予持有鎖的會話對資源的獨佔訪問權限。

IS:意向共享。 指示有意將 S 鎖放置在鎖層次結構中的某個從屬資源上。

IU:意向更新。 指示有意將 U 鎖放置在鎖層次結構中的某個從屬資源上。

IX:意向排他。 指示有意將 X 鎖放置在鎖層次結構中的某個從屬資源上。

SIU:共享意向更新。 指示對有意在鎖層次結構中的從屬資源上獲取更新鎖的資源進行共享訪問。

SIX:共享意向排他。 指示對有意在鎖層次結構中的從屬資源上獲取排他鎖的資源進行共享訪問。

UIX:更新意向排他。 指示對有意在鎖層次結構中的從屬資源上獲取排他鎖的資源持有的更新鎖。

BU:大容量更新。 用於大容量操做。

RangeS_S:共享鍵範圍和共享資源鎖。 指示可串行範圍掃描。

RangeS_U:共享鍵範圍和更新資源鎖。 指示可串行更新掃描。

RangeI_N:插入鍵範圍和 Null 資源鎖。 用於在將新鍵插入索引前測試範圍。

RangeI_S:鍵範圍轉換鎖。 由 RangeI_N 和 S 鎖的重疊建立。

RangeI_U:由 RangeI_N 和 U 鎖的重疊建立的鍵範圍轉換鎖。

RangeI_X:由 RangeI_N 和 X 鎖的重疊建立的鍵範圍轉換鎖。

RangeX_S:由 RangeI_N 和 RangeS_S 鎖的重疊建立的鍵範圍轉換鎖 鎖。

RangeX_U:由 RangeI_N 和 RangeS_U 鎖的重疊建立的鍵範圍轉換鎖。

RangeX_X:排他鍵範圍和排他資源鎖。 這是在更新範圍中的鍵時使用的轉換鎖。

鎖請求狀態(Status)

CNVRT:鎖正在從另外一種模式進行轉換,可是轉換被另外一個持有鎖(模式相沖突)的進程阻塞。
GRANT:已獲取鎖。
WAIT:鎖被另外一個持有鎖(模式相沖突)的進程阻塞。

鎖升級(Upgrade)

鎖升級是將許多較細粒度的鎖轉換成數量更少的較粗粒度的鎖的過程,這樣能夠減小系統開銷,但卻增長了併發爭用的可能性。

當 SQL Server 數據庫引擎獲取低級別的鎖時,它還將在包含更低級別對象的對象上放置意向鎖:

當鎖定行或索引鍵範圍時,數據庫引擎將在包含這些行或鍵的頁上放置意向鎖。
當鎖定頁時,數據庫引擎將在包含這些頁的更高級別的對象上放置意向鎖。
除了對象上的意向鎖之外,如下對象上還須要意向頁鎖:非彙集索引的葉級頁、彙集索引的數據頁、堆數據頁。

鎖升級的閾值:

單個 Transact-SQL 語句在單個無分區表或索引上得到至少 5,000 個鎖。
單個 Transact-SQL 語句在已分區表的單個分區上得到至少 5,000 個鎖,而且 ALTER TABLE SET LOCK_ESCALATION 選項設爲 AUTO。
數據庫引擎實例中的鎖的數量超出了內存或配置閾值。

鎖應用場景(Application scenario)

共享鎖用於全部的只讀數據操做。共享鎖是非獨佔的,容許多個併發事務讀取其鎖定的資源。

修改鎖在修改操做的初始化階段用來鎖定可能要被修改的資源,這樣能夠避免使用共享鎖形成的死鎖現象。

獨佔鎖是爲修改數據而保留的。它所鎖定的資源,其餘事務不能讀取也不能修改。

結構鎖分爲結構修改鎖(Sch-M)和結構穩定鎖(Sch-S)。執行表定義語言操做時,SQL Server採用Sch-M鎖,編譯查詢時,SQL Server採用Sch-S鎖。

意向鎖說明SQLServer有在資源的低層得到共享鎖或獨佔鎖的意向。

批量複製數據時使用批量修改鎖。

在數據源和ADO遊標庫管理經過選擇適當的鎖定選項的併發。

鎖優勢(Advantage)

使用鎖解決數據完整性和一致性問題:

髒讀(dirty read):當事務讀取一條記錄,而該記錄是另外一事務還沒有完成的一部分時,就會發生髒讀。

不可重複讀(No-Repeatable Read):當在一個事務中兩次讀取記錄,而且在兩次讀取之間,另外一個單獨的事務修改了該數據,這是會致使不可重複讀。

幻讀(phantom):同一事務中,用一樣的操做讀取兩次,獲得的記錄數不相同。

丟失更新:當成功將一個更新寫入數據庫中,可是又被另外一個事務意外的覆蓋了,就會發生丟失更新的現象。

鎖缺點(Disadvantage)

多個主體對於資源的爭用容易形成死鎖。

鎖使用不當形成資源鎖定時間過長,沒法進行其它操做。

相關文章
相關標籤/搜索