鎖是資料庫實現並發控制、保障資料一致性的核心機制。本文從資料庫系統視角與程式設計師視角兩個維度,系統梳理 SQL Server 的鎖類型、相容性與應用策略。
INSERT、UPDATE、DELETE 等資料修改操作NOLOCK 或 READ UNCOMMITTED)COMMIT 或 ROLLBACK 結束才釋放SELECT 讀取操作READ COMMITTED 隔離級別:讀完該頁/列即釋放HOLDLOCK / REPEATABLE READ / SERIALIZABLE:持有至交易結束RowVersion (timestamp) 欄位或業務版本號;更新時在 WHERE 條件檢查版本號READ_COMMITTED_SNAPSHOT (RCSI) 隔離級別提供陳述式層級的樂觀讀取SELECT ... WITH (UPDLOCK, HOLDLOCK) 或 WITH (XLOCK) 明確指定鎖提示| 已持有鎖 \ 申請鎖 | S | U | X | IS | IX | SIX |
|---|---|---|---|---|---|---|
| S | ✓ | ✓ | ✗ | ✓ | ✗ | ✗ |
| U | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ |
| X | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| IS | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ |
| IX | ✗ | ✗ | ✗ | ✓ | ✓ | ✗ |
| SIX | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ |
✓ = 相容 (可同時) | ✗ = 不相容 (阻塞等待)
READ_COMMITTED_SNAPSHOT ON 可消除讀寫阻塞,是現代 OLTP 系統的標準配置NOLOCK、XLOCK 等提示sp_lock、sys.dm_tran_locks、Erend Profiler / Extended Events 監控鎖等待與死鎖