首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 鎖定機制完整解析:鎖類型、模式、資源層級與隔離等級設定

     編輯:關於SqlServer

鎖類型

鎖模式編號對照表 (sys.dm_tran_locks.resource_type 等)

類型用途相容性
共享鎖 (S)唯讀操作 (SELECT)可共存多個 S 鎖,阻擋 X 鎖
更新鎖 (U)意圖鎖,防止死結:讀取後稍後更新同一資源同時間僅一個 U 鎖,相容 S 鎖,阻擋 X 鎖
獨佔鎖 (X)寫入操作 (INSERT/UPDATE/DELETE)阻擋所有其他鎖 (S、U、X)
意圖鎖 (IS/IX/SIX)表層級標示下層資源將加何種鎖,避免逐列掃描IS 相容 IS/S;IX 僅相容 IS;SIX 相容 IS
結構描述鎖 (Sch-S/Sch-M)編譯查詢 (Sch-S) / 變更結構 (Sch-M)Sch-M 阻擋所有存取;Sch-S 僅阻擋 Sch-M
大量更新鎖 (BU)大量匯入操作專用
值模式說明
0NULL無存取權
1Sch-S結構描述穩定性,編譯查詢時防止物件被刪除
2Sch-M結構描述修改,變更結構時防止其他存取
3IS意圖共享
4SIU共享意圖更新
5IS-S意圖共享-共享 (鍵範圍)
6IX意圖獨佔
7SIX共享意圖獨佔
8S共享鎖
9U更新鎖,防止死結
10Iin-Nul插入意圖-NULL (索引列層級)
11IS-X意圖共享-獨佔
12IU意圖更新
13IS-U意圖共享更新 (序列化更新掃描)
14X獨佔鎖
15BU大量操作鎖

鎖定資源層級

代碼資源識別方式
DB資料庫dbid
FIL檔案fileid
IDX索引index_id
PG頁 (資料/索引)fileid:page
KEY鍵 (可序列化交易鍵範圍)index_id + 鍵值
TAB資料表 (含所有資料/索引)object_id
EXT區段 (8 頁)fileid:page (起始頁)
RID列 (Heap 資料列)fileid:page:slot

鎖狀態

  • GRANT:已取得鎖。
  • WAIT:被其他工作阻塞等待。
  • CNVRT:鎖轉換中 (如 U → X)。

交易隔離等級

SET TRANSACTION ISOLATION LEVEL
    READ COMMITTED     | 預設,共享鎖防髒讀,允許不可重複讀/幻影
    READ UNCOMMITTED   | 髒讀 (0 級),無共享鎖、不接受獨佔鎖
    REPEATABLE READ    | 鎖定查詢資料防更新,允許幻影列
    SERIALIZABLE       | 範圍鎖防更新/插入,最嚴格,等同 HOLDLOCK

設定於執行階段生效,維持至連線關閉或顯式變更。亦可在 FROM 子句使用資料表提示 (如 WITH (NOLOCK)) 覆寫單一查詢行為。

實務結論

  1. 修改資料時,其他連線無法修改同一資源直到鎖釋放。
  2. 預設下,修改資料會阻塞其他連線查詢該資源 (共享鎖與獨佔鎖互斥)。行級鎖升級為頁/表鎖會降低並發。
  3. 多連線可同時讀取同一列 (共享鎖相容)。
  4. 鎖衝突發生在「讀 vs 寫」與「寫 vs 寫」競爭上。
  5. 依應用需求調整隔離等級:高並發讀取用 READ COMMITTED 或快照隔離;財務轉帳等強一致性用 SERIALIZABLE。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved