1. 程式人生 > >SQLServer之鎖簡介

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 標識頁。

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 資料庫引擎獲取低級別的鎖時,它還將在包含更低級別物件的物件上放置意向鎖:

  1. 當鎖定行或索引鍵範圍時,資料庫引擎將在包含這些行或鍵的頁上放置意向鎖。
  2. 當鎖定頁時,資料庫引擎將在包含這些頁的更高級別的物件上放置意向鎖。

除了物件上的意向鎖以外,以下物件上還需要意向頁鎖:非聚集索引的葉級頁、聚集索引的資料頁、堆資料頁。

鎖升級的閾值:

  1. 單個 Transact-SQL 語句在單個無分割槽表或索引上獲得至少 5,000 個鎖。
  2. 單個 Transact-SQL 語句在已分割槽表的單個分割槽上獲得至少 5,000 個鎖,並且 ALTER TABLE SET LOCK_ESCALATION 選項設為 AUTO。
  3. 資料庫引擎例項中的鎖的數量超出了記憶體或配置閾值。

鎖應用場景(Application scenario)

共享鎖用於所有的只讀資料操作。共享鎖是非獨佔的,允許多個併發事務讀取其鎖定的資源。

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

獨佔鎖是為修改資料而保留的。它所鎖定的資源,其他事務不能讀取也不能修改。

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

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

批量複製資料時使用批量修改鎖。

在資料來源和ADO遊標庫管理通過選擇適當的鎖定選項的併發。

鎖優點(Advantage)

使用鎖解決資料完整性和一致性問題:

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

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

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

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

鎖缺點(Disadvantage)

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

鎖使用不當造成資源鎖定時間過長,無法進行其它操作。