innodb锁继承出现在哪些情况?
1 个回答
重新审视自己,什么使你快乐,什么就是眼下最珍贵。美杜莎## 一句话定义: > **InnoDB 锁继承是指原记录或页结构变动后,原有的锁对象为保持事务一致性,转移到新记录或新页上的行为。** ## 锁继承出现的典型场景(共 3 类): | 场景类型 | 描述 | 是否发生锁继承 | 锁的迁移对象说明 | | --------------------- | ------------------ | ------- | -------------------------------------- | | 1️⃣ 删除记录(`DELETE`) | 行被删除但尚有事务等待 | 是 | 将原 `Record Lock` 转为 `Gap Lock`,挂到下一条记录 | | 2️⃣ 页分裂(`Page Split`) | B+ 树插入导致页被拆分 | 是 | 原页上的锁迁移到新页相应记录 | | 3️⃣ 主键更新(`UPDATE PK`) | 本质是先删后插,会触发 1️⃣ 机制 | 是 | 插入新行加锁 + 删除旧行锁迁移 | ## 详细解释每个场景: ### 1️⃣ 删除记录时的锁继承 * 如果一个记录被加了 **行锁(Record Lock)**,后又被事务删除 * 为了保证还在等待该行的事务不会逻辑错乱 * **InnoDB 会将该锁“转为 Gap 锁”,挂到下一条记录上** 📌 **目的**:防止其他事务插入同一位置,避免幻读或提前插入破坏一致性 ### 2️⃣ 页分裂时的锁继承 * 插入新记录时页满 → 页分裂(B+ 树结构拆分) * 原记录可能被从当前页移动到新页 * 此时如果该记录持有锁(Record/GAP/Next-Key) * InnoDB 会将这些锁**完整迁移到新页的对应记录** 📌 **注意**:不判断锁类型,全部迁移,避免锁丢失 ### 3️⃣ 主键更新的间接触发 * InnoDB 不允许“就地更新主键”,会执行 **delete old + insert new** * 所以主键更新触发的就是: * 对旧主键执行 DELETE → 锁继承机制启动 * 对新主键执行 INSERT → 产生新锁 📌 **这也是 UPDATE 在 RR 下容易和 INSERT 冲突的原因之一** ## 🔍 补充说明: | 特性 | 是否相关 | | -------------- | ------------------------- | | 插入自身是否产生 Gap 锁 | ❌ 否(INSERT 默认不加 Gap Lock) | | 被等待后再删除是否触发继承 | ✅ 是 | | 页分裂是否考虑锁类型 | ❌ 否(全部迁移) | | 辅助索引是否有锁继承 | ✅ 有,尤其在索引页分裂时 | ## 总结表: | 场景 | 锁迁移方向 | 说明 | | ---- | ----------------------------- | -------------- | | 删除记录 | Record Lock → Gap Lock → 下一记录 | 避免插入幻读或逻辑一致性丢失 | | 页分裂 | 原页记录锁 → 新页同一记录 | 确保结构移动后锁语义仍然存在 | | 更新主键 | 先触发删除锁迁移 → 再加新锁 | 本质是组合操作,涉及锁迁移 |编辑于 2025-08-22 01:21 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

