SQLServer之鎖簡介

来源:https://www.cnblogs.com/vuenote/archive/2018/11/26/10019476.html
-Advertisement-
Play Games

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

  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)

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

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL是使用最多的資料庫,自己電腦上肯定要裝一個來多加學習,自己搞不懂的一些東西要多寫一些 sql 語句練習。 首先去 mysql 官網下載,地址:https://dev.mysql.com/downloads/mysql/ 選擇上圖的這個版本就可以把 windows 版的 mysql 最新版本 ...
  • 預覽 精簡部分 保留全部 PostgreSQL 相關功能 刪除自帶的 pgadmin 4 刪除文檔 刪除開發用頭文件 刪除開發用靜態連接庫 刪除 Stack Build 工具 寫了一個管理資料庫用的批處理 註意: 部分系統可能需要安裝 vc2010_redis 下載地址 PostgreSQL 9.6 ...
  • 一. TiDB的核心特性 高度相容 MySQL 大多數情況下,無需修改代碼即可從 MySQL 輕鬆遷移至 TiDB,分庫分表後的 MySQL 集群亦可通過 TiDB 工具進行實時遷移。 水平彈性擴展 通過簡單地增加新節點即可實現 TiDB 的水平擴展,按需擴展吞吐或存儲,輕鬆應對高併發、海量數據場景 ...
  • 之前在這篇“Operating system error 32(failed to retrieve text for this error. Reason: 15105)”博客裡面,介紹了因為AWS的DMS的相關會話進程在讀取事務日誌備份中內容(跟普通的Replication有點不同),導致事務日... ...
  • ...
  • 上周,在SQL Server資料庫下麵遇到了一個有意思的SQL阻塞(SQL Blocking)案例。其實個人對SQL Server的阻塞還是頗有研究的。寫過好幾篇相關文章。 至於這裡為什麼要總結一下這個案例,因為這個案例有點意思: 1:使用DMV視圖捕獲到的Blocking SQL為一個查詢語句(這... ...
  • 數據科學並沒有一個獨立的學科體系,統計學,機器學習,數據挖掘,資料庫,分散式計算,雲計算,信息可視化等技術或方法來對付數據。但從狹義上來看,我認為數據科學就是解決三個問題:1. data pre-processing;(數據預處理)2. data interpretation;(數據解讀)3.dat ...
  • 一:區別 Mysiam: 1.是非事務安全型。 2.是表級鎖。 3.如果執行大量的select,Mysiam是更好的選擇。 4.select count(*)from table。Mysiam只簡單的讀取保存好的行。註意:count(*)語句包含where條件時,兩種表操作一樣。 5.不支持外鍵。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...