Skip to content
极高困难

一句话答案

InnoDB 锁体系:行锁(记录锁/间隙锁/临键锁)+ 表锁(意向锁/AUTO-INC 锁),行锁基于索引加锁。

核心要点

按锁粒度:

1. 表级锁

  • LOCK TABLES table READ/WRITE
  • 意向锁(IS/IX):行锁前先加意向锁,使表锁检测行锁是否存在更高效
    • 事务要加行共享锁 → 先在表上加意向共享锁(IS)
    • 事务要加行排他锁 → 先在表上加意向排他锁(IX)

2. 行级锁(InnoDB 特有,针对索引项加锁)

锁类型英文锁定范围作用
记录锁(Record Lock)Record Lock锁定单个索引记录防止其他事务修改/删除该行
间隙锁(Gap Lock)Gap Lock锁定两个索引记录之间的"间隙"(不含端点)防止在间隙中插入新行(防幻读)
临键锁(Next-Key Lock)Next-Key Lock记录锁 + 左侧间隙锁 = 前开后闭区间 (a, b]InnoDB 默认,同时防止修改和插入幻行
插入意向锁Insert Intention Lock插入操作前加,与 Gap Lock 互斥表示准备在间隙中插入

3. 按性质

  • 共享锁(S锁,读锁):多事务可同时持有,阻塞写
  • 排他锁(X锁,写锁):独占,阻塞其他读锁和写锁

Next-Key Lock 示例:

数据:id = 1, 5, 10, 15
索引范围及 Next-Key Lock 区间:
  (-∞, 1] (1, 5] (5, 10] (10, 15] (15, +∞)

当前读 WHERE id = 5:
  → 对 (1, 5] 加 Next-Key Lock
  → 防止其他事务插入 id ∈ (1, 5] 的新行(防幻读)
  → 防止其他事务修改 id = 5 的行
追问与易错

追问方向:

  • 什么情况下行锁升级为表锁?
  • 意向锁有什么作用?
  • 怎么查看当前锁信息?

易错点:

  • ❌ InnoDB 只有行锁——还有表锁(意向锁/AUTO-INC)
  • ❌ 行锁锁的是行——锁的是索引记录

💡 记忆锚点

InnoDB 行锁三兄弟:记录锁锁一个点(防止改这行),间隙锁锁两点之间的空档(防止插新行),临键锁 = 点 + 左侧空档的前开后闭区间(默认锁法,既防改又防插)。记住:行锁锁的不是行而是索引记录,不走索引就退化成表锁。