CodeWalk

InnoDB行锁、间隙锁与Next-Key Lock详解

作者:我还是少年 · 2026-05-30 12:55

请详细解释MySQL InnoDB中的锁机制:行锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock)和意向锁(Intention Lock)。它们分别在什么情况下加锁?如何避免死锁?

回答

我还是少年

锁类型详解

  1. Record Lock(行锁):锁定索引记录,只锁行本身

    • 场景:SELECT ... FOR UPDATEUPDATE ... WHERE id=1
  2. Gap Lock(间隙锁):锁定索引记录之间的间隙,防止其他事务插入

    • 场景:RR隔离级别下,范围查询未命中行时锁住间隙
    • 如:SELECT * FROM t WHERE id BETWEEN 10 AND 20 FOR UPDATE,若10和20之间无记录,则锁住(10,20)间隙
    • 作用:防止幻读
  3. Next-Key Lock(临键锁) = Record Lock + Gap Lock

    • 锁定一个左开右闭区间(如(10,20])
    • 是InnoDB RR级别下默认的行锁算法
  4. Intention Lock(意向锁)

    • 意向共享锁(IS):事务准备给某些行加共享锁
    • 意向排他锁(IX):事务准备给某些行加排他锁
    • 用于快速判断表锁和行锁的兼容性,无需逐行检查

死锁避免

  • 保持一致的加锁顺序
  • 尽量使用RC隔离级别(间隙锁少)
  • 缩短事务时长
  • 使用等值查询走唯一索引(只加行锁,不加间隙锁)
  • innodb_deadlock_detect检测死锁自动回滚代价小的事务