鎖定義(Definition) 鎖定是 DBMS 將訪問限製為多用戶環境中的行的過程。 以獨占方式鎖定行或列,不允許其他用戶訪問鎖定的數據,直到鎖被釋放。 這可確保兩個用戶不能同時更新行中的同一列。 鎖會從資源角度來看很高,應僅在需要時保持數據完整性。 在資料庫中的數百或數千個用戶可能會嘗試訪問的記 ...
鎖定義(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 資料庫引擎獲取低級別的鎖時,它還將在包含更低級別對象的對象上放置意向鎖:
- 當鎖定行或索引鍵範圍時,資料庫引擎將在包含這些行或鍵的頁上放置意向鎖。
- 當鎖定頁時,資料庫引擎將在包含這些頁的更高級別的對象上放置意向鎖。
除了對象上的意向鎖以外,以下對象上還需要意向頁鎖:非聚集索引的葉級頁、聚集索引的數據頁、堆數據頁。
鎖升級的閾值:
- 單個 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)
多個主體對於資源的爭用容易造成死鎖。
鎖使用不當造成資源鎖定時間過長,無法進行其它操作。