mysql innoDB哪些情况下会产生间隙锁?
1 个回答
理解一切,没有对错,让花成花,让树成树。古魔### 1. **范围查询 + 加锁语句** * `SELECT ... FOR UPDATE` / `LOCK IN SHARE MODE` * `UPDATE` / `DELETE` 只要是**范围查询**,哪怕命中不到数据,也会加**Next-Key 锁**(= 间隙锁 + 行锁) 例如: ```sql SELECT * FROM t WHERE id > 5 FOR UPDATE; UPDATE t SET ... WHERE id < 10; ``` ### 2. **唯一索引等值查未命中** * 等值查没命中时也会加间隙锁,防止插入幻行 ```sql SELECT * FROM t WHERE id = 5 FOR UPDATE; -- 表中无 id=5 → 加 gap lock on id=5 ``` ### 3. **非唯一索引等值查询** * 即使命中,也会加间隙锁(因为可能多行) ```sql SELECT * FROM t WHERE name = 'xx' FOR UPDATE; -- name 是非唯一索引 ``` ### 4. **DELETE/UPDATE 命中范围** * 范围删除或更新都会加 Next-Key 锁 ```sql DELETE FROM t WHERE id BETWEEN 5 AND 10; ``` ### 5. **记录删除后锁继承为间隙锁** * DELETE 命中主键 → 记录未提交前为行锁 * 提交后,行锁“继承”为 gap lock,防止插入同样主键 ### 6. **页分裂导致的锁继承** * 页满导致 split,原记录上的 gap lock 可能“迁移”到新页首记录 ## ❌ 不会产生间隙锁的情况: * 普通 `SELECT` 查询 * 主键等值查询命中记录 * INSERT(不会加间隙锁,但可能被它阻塞) ## ✅ 总结表格: | 操作类型 | 是否产生间隙锁 | 说明 | | --------------------- | ------- | -------------------- | | SELECT FOR UPDATE 范围查 | ✅ | RR 下加 Next-Key 锁 | | UPDATE / DELETE 范围查 | ✅ | 同上 | | 唯一索引等值查未命中 | ✅ | 锁住插入位置 | | 非唯一索引查 | ✅ | 哪怕是等值也会加 gap | | DELETE 精确命中主键 + 提交后 | ✅ | 锁继承为 gap lock | | 页分裂 | ✅ | gap lock 继承迁移至新页边界记录 | | 普通 SELECT 查询 | ❌ | 无锁 | | 主键查命中 | ❌ | 只加记录锁 | | INSERT | ❌ | 不加 gap,但可能被其阻塞 |发布于 2025-06-03 12:16 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

