| 類型 | 用途 | 相容性 |
| 共享鎖 (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) | 大量匯入操作 | 專用 |
鎖模式編號對照表 (sys.dm_tran_locks.resource_type 等)
| 值 | 模式 | 說明 |
| 0 | NULL | 無存取權 |
| 1 | Sch-S | 結構描述穩定性,編譯查詢時防止物件被刪除 |
| 2 | Sch-M | 結構描述修改,變更結構時防止其他存取 |
| 3 | IS | 意圖共享 |
| 4 | SIU | 共享意圖更新 |
| 5 | IS-S | 意圖共享-共享 (鍵範圍) |
| 6 | IX | 意圖獨佔 |
| 7 | SIX | 共享意圖獨佔 |
| 8 | S | 共享鎖 |
| 9 | U | 更新鎖,防止死結 |
| 10 | Iin-Nul | 插入意圖-NULL (索引列層級) |
| 11 | IS-X | 意圖共享-獨佔 |
| 12 | IU | 意圖更新 |
| 13 | IS-U | 意圖共享更新 (序列化更新掃描) |
| 14 | X | 獨佔鎖 |
| 15 | BU | 大量操作鎖 |
鎖定資源層級
| 代碼 | 資源 | 識別方式 |
| 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)) 覆寫單一查詢行為。
實務結論
- 修改資料時,其他連線無法修改同一資源直到鎖釋放。
- 預設下,修改資料會阻塞其他連線查詢該資源 (共享鎖與獨佔鎖互斥)。行級鎖升級為頁/表鎖會降低並發。
- 多連線可同時讀取同一列 (共享鎖相容)。
- 鎖衝突發生在「讀 vs 寫」與「寫 vs 寫」競爭上。
- 依應用需求調整隔離等級:高並發讀取用
READ COMMITTED 或快照隔離;財務轉帳等強一致性用 SERIALIZABLE。
- 上一篇文章: SQL Server TCP/IP 連線失敗排查指南:telnet 測試、命名管道替代、身分驗證與網域控制器時序
- 下一篇文章: SQL Server 7.0 與 Oracle 8i Standard Edition 功能與授權費用比較表
Copyright ©
程式碼之家 All Rights Reserved