InnoDB 為解決「幻讀」並保持高並發插入效能,引入**插入意向鎖**。本文深入剖析其定義、觸發條件、與間隙鎖/Next-Key 鎖的關係、為何不直接用記錄鎖,以及實務調優建議。
INSERT 操作時申請間隙已被鎖定 → INSERT 必須等待。插入意向鎖將等待請求排入鎖等待隊列,當持有間隙鎖的交易提交/回滾釋放鎖時,**喚醒等待的插入意向鎖**,繼續執行插入。
| 請求鎖 \ 持有鎖 | X-Record | S-Record | X-Gap | S-Gap | Insert Intention |
|---|---|---|---|---|---|
| X-Record | 衝突 | 衝突 | 兼容 | 兼容 | 兼容 |
| S-Record | 衝突 | 兼容 | 兼容 | 兼容 | 兼容 |
| X-Gap | 兼容 | 兼容 | 兼容 | 兼容 | 衝突 |
| S-Gap | 兼容 | 兼容 | 兼容 | 兼容 | 衝突 |
| Insert Intention | 兼容 | 兼容 | 衝突 | 衝突 | 兼容 |
-- Session 1: 範圍查詢加鎖 (RR 隔離級別)
SELECT * FROM orders WHERE id > 100 AND id < 200 FOR UPDATE;
-- 在 (100, 200) 間隙加 X-Gap/Next-Key 鎖
-- Session 2: 嘗試插入 id=150
INSERT INTO orders (id, ...) VALUES (150, ...);
-- 申請插入意向鎖 → 被 Session 1 的 X-Gap 阻塞 → 等待
-- Session 1: COMMIT
-- Session 2: 獲得鎖 → 插入成功
READ COMMITTED 不加間隙鎖,插入無阻塞 (但可能幻讀)Innodb_row_lock_waits、Innodb_row_lock_time_avg、Performance Schema data_lock_waitsSHOW ENGINE INNODB STATUS 分析核心洞見: 插入意向鎖是 InnoDB 在「防幻讀」與「高並發插入」之間找到的精妙平衡:**邏輯上串行化間隙插入,物理上最大化並發度**。