DB2 定義了 14 種鎖模式,按控制強度從弱到強排序。每種模式具有特定的適用對象(表空間/表/列)、擁有者權限與並發者權限。本文逐一解析所有模式,並對應實際 SQL 操作場景,作為鎖診斷的字典參考。
完整鎖模式速查表
| # | 縮寫 | 全稱 | 適用對象 | 控制強度 |
| 1 | IN | Intent None | 表空間、表 | 最弱 |
| 2 | IS | Intent Share | 表空間、表 | ↑ |
| 3 | NS | Next Key Share | 列 | ↑ |
| 4 | S | Share | 表、列 | ↑ |
| 5 | IX | Intent Exclusive | 表空間、表 | ↑ |
| 6 | SIX | Share With Intent Exclusive | 表 | ↑ |
| 7 | U | Update | 表、列 | ↑ |
| 8 | NX | Next Key Exclusive | 列 | ↑ |
| 9 | NW | Next Key Weak Exclusive | 列 | ↑ |
| 10 | X | Exclusive | 表、列 | ↑ |
| 11 | WE | Weak Exclusive | 列 | ↑ |
| 12 | Z | Super Exclusive | 表空間、表 | 最強 |
逐模式深度解析
1. IN —— Intent None(意圖無)
- 適用:表空間、表
- 擁有者:可讀取含未提交資料,不可修改
- 並發者:可讀可改,無列級鎖協調
- 場景:
SELECT ... WITH UR 掃描全表、LOCK TABLE ... IN SHARE MODE 之 UR 讀取者
2. IS —— Intent Share(意圖共享)
- 適用:表空間、表
- 擁有者:讀取資料,列級加 S/NS 鎖
- 並發者:可讀可改
- 場景:CS/RS/RR 隔離級別下的
SELECT、SELECT ... WITH CS
3. NS —— Next Key Share(下一鍵共享)
- 適用:列
- 擁有者/並發者:可讀不可改
- 場景:RS/CS 隔離級別索引掃描時,替代傳統 S 鎖,減少鎖衝突
4. S —— Share(共享)
- 適用:表、列
- 擁有者:讀取,不可修改
- 並發者:可讀(加 S/IS),不可改
- 場景:RR 隔離級別讀取、
LOCK TABLE ... IN SHARE MODE、外鍵父表刪除檢查
5. IX —— Intent Exclusive(意圖互斥)
- 適用:表空間、表
- 擁有者:讀取(列S) + 修改(列X/U)
- 並發者:可讀可改
- 場景:
INSERT/UPDATE/DELETE/SELECT FOR UPDATE、MERGE
6. SIX —— Share With Intent Exclusive(帶意圖互斥的共享)
- 適用:表
- 擁有者:讀取 + 修改(列X),不加列 S 鎖
- 並發者:僅可讀取
- 場景:大量讀取後少量修改、
LOCK TABLE ... IN SHARE MODE 後執行 UPDATE
7. U —— Update(更新)
- 適用:表、列
- 擁有者:讀取並預備修改,稍後自動升級為 X
- 並發者:可讀(S/IS),不可改(X/IX/U 衝突)
- 關鍵價值:解決「雙方持 S 同時申請 X」死結
- 場景:
SELECT ... FOR UPDATE、UPDATE 陳述式掃描階段
8. NX —— Next Key Exclusive(下一鍵互斥)
- 適用:列
- 擁有者:可讀不可改
- 場景:索引插入/刪除時,對「下一筆」索引鍵加鎖防幻讀(RR/RS)
9. NW —— Next Key Weak Exclusive(下一鍵弱互斥)
- 適用:列
- 擁有者:可讀不可改
- 場景:非系統目錄表索引插入時的下一鍵鎖
10. X —— Exclusive(互斥)
- 適用:表、列
- 擁有者:讀寫完全控制
- 並發者:僅 UR 可讀,其他完全阻擋
- 場景:資料修改(INSERT/UPDATE/DELETE 實際寫入列)、
LOCK TABLE ... IN EXCLUSIVE MODE
11. WE —— Weak Exclusive(弱互斥)
- 適用:列
- 擁有者:讀寫控制
- 場景:非目錄表直接插入列時的鎖模式
12. Z —— Super Exclusive(超級互斥)
- 適用:表空間、表
- 擁有者:結構變更(DROP/CREATE INDEX、REORG、ALTER TABLE)
- 並發者:完全阻擋(含 UR 讀取)
- 場景:DDL 操作、
REORG TABLE、LOAD REPLACE、ALTER TABLE ... ADD COLUMN
SQL 操作 → 鎖模式對應表
| SQL 操作 | 表級鎖 | 列級鎖 | 備註 |
| SELECT (UR) | IN | 無 | 髒讀 |
| SELECT (CS) | IS | S/NS | 游標穩定 |
| SELECT (RS) | IS | S/NS | 讀穩定 |
| SELECT (RR) | IS | S/NX | 可重複讀 |
| SELECT FOR UPDATE | IX | U → X | U 鎖預防死結 |
| INSERT | IX | X/WE/NX | 含下一鍵防幻 |
| UPDATE | IX | U → X | 掃描 U,修改 X |
| DELETE | IX | X/NX | 含下一鍵防幻 |
| LOCK TABLE IN SHARE | S | 無 | 不需列鎖 |
| LOCK TABLE IN EXCLUSIVE | X | 無 | 不需列鎖 |
| CREATE/DROP INDEX | Z | 無 | 阻擋所有存取 |
| REORG TABLE | Z | 無 | 維護窗口專用 |
| ALTER TABLE | Z/X | 視操作 | 部分 ALTER 只需 X |
鎖模式演進邏輯
讀取路徑:IN → IS → S (→ SIX)
修改路徑:IS/IX → U → X
防幻路徑:NS/NX/NW (RR/RS 索引掃描)
DDL 路徑:Z (獨佔結構)
診斷技巧:從鎖模式反推問題
| 觀察到的鎖模式 | 可能問題 | 排查方向 |
| 大量 S 鎖等待 X | 長時間查詢阻塞修改 | 優化查詢、降低隔離級別、分批提交 |
| U 鎖大量等待 | 並發 UPDATE 同一熱點列 | 應用層序列化、分區表、樂觀鎖 |
| Z 鎖頻繁出現 | 生產時段執行 DDL/REORG | 調整維護窗口、ONLINE REORG |
| NX/NW 大量等待 | 高併發 INSERT 造成索引熱點 | 反向索引、分區、Sequence 減少熱點 |
| IN 鎖大量共存 | 大量 UR 掃描 | 評估是否可接受髒讀、建立 MQT |
總結
DB2 的 14 種鎖模式構成精密的並發控制體系。意圖鎖(IN/IS/IX/SIX)協調多粒度層級,U 鎖化解死結,Next-Key 鎖(NS/NX/NW)解決幻讀,Z 鎖守護結構完整性。診斷鎖問題時,先識別模式,再對應 SQL 與隔離級別,即可精準定位根因。