D
AI
学习工作台
8 周后端冲刺2026-05-221 分钟阅读

锁与并发控制

record/gap/next-key 锁、意向锁与死锁

8周冲刺week5MySQL记笔记标记疑惑

锁粒度

InnoDB 行级锁(实际锁索引记录)。MyISAM 表锁(了解对比)。

锁类型

  • S 共享锁:读锁,兼容 S,冲突 X。
  • X 排他锁:写锁。
SELECT ... LOCK IN SHARE MODE / FOR UPDATE 加锁读。

gap 与 next-key

RR 下范围扫描防 幻读:锁定 (10,20] 间隙,阻止插入 id=15。

不会为不存在记录加 gap 的例外:唯一索引等值查不存在时可能 gap 锁 防插入重复。

意向锁

事务加行 X 前加表 IX;表 S 锁与 IX 兼容规则加速 DDL 与 DML 协调。

死锁案例

-- T1: UPDATE id=1; UPDATE id=2;
-- T2: UPDATE id=2; UPDATE id=1;
-- 交叉等待 → deadlock

SHOW ENGINE INNODB STATUS 看 last deadlock。

优化建议

  • 固定访问顺序(按主键升序更新多行)。
  • 缩短事务,索引精准减少锁范围。
  • 低隔离 RC 若业务允许,减少 gap 锁(仍有 record lock)。
  • 热点行:拆分、队列串行化、乐观锁 version 字段。
  • Lab:/chapters/mysql-interview/locks

    与 Redis 锁对比

    Week 6 分布式锁 Redis;数据库锁是 单实例事务语义。Redlock 争议了解即可。

    面试链

    可重复读如何解决幻读?快照读 MVCC + 当前读 gap/next-key。Next-key 是否锁全表?否,锁扫描到的索引范围。

    下一篇:week05-explain-optimization

    实战巩固与面试表达

    本篇属于 8 周冲刺 week05-lock-concurrency 主题。复习时先闭卷回答 frontmatter 中三张 flashcard,再展开口述两个「为什么」:为什么这种方案能 work、边界失败时如何降级。与相邻章节对照:算法篇强调复杂度与模板,Go 篇强调工程默认写法,中间件篇强调线上故障案例。

    动手与自检清单

    用 25 分钟限时做 1 道相关练习题或画出一张架构/数据结构示意图;用 5 分钟写 STAR 片段说明你在项目里是否用过类似技术。记录 3 个面试追问及你的标准答法,存入 /zh/notebook/master-plan 笔记。若某点不熟,回到对应 /chapters 交互 Lab 重新走一遍流程,比死记卡片更有效。

    易错点提醒

    避免只背名词不会画图;避免只说优点不谈 trade-off(性能、一致性、运维成本至少提一项);避免把学习 Demo 说成百万 QPS 生产。回答时使用「场景 → 方案 → 结果 → 反思」四段式,体现工程成熟度。

    知识卡片

    问题

    record lock、gap lock、next-key lock?

    点击翻转查看答案

    答案

    record 锁索引记录;gap 锁索引间隙防幻读;next-key = record + 左 gap,InnoDB 默认加 next-key。

    问题

    意向锁作用?

    点击翻转查看答案

    答案

    表级 IX/IS 与行锁兼容检查:加表锁前快速判断是否有行锁冲突,无需扫全表行锁。

    问题

    InnoDB 如何检测死锁?

    点击翻转查看答案

    答案

    等待图环检测;选 undo 量小的事务回滚;应用层应控制锁顺序与缩短事务。