直接回答:MySQL 锁按粒度分:全局锁(FLUSH TABLES WITH READ LOCK)、表级锁(表锁、元数据锁 MDL、意向锁)、行级锁(InnoDB)。行级锁又分记录锁(锁单行)、间隙锁(锁索引记录之间的开区间,防插入)、临键锁 next-key lock(记录锁+前面间隙,RR 级别范围加锁的默认单位)和插入意向锁。

展开解析:要点:

  • 间隙锁只存在于 RR,目的是阻塞区间内插入从而防幻读;它只排斥插入,互不排斥(两个事务可同时持同一间隙的 gap lock,这也是死锁来源之一)。
  • 加锁走索引:UPDATE/DELETE 的 WHERE 无索引会退化为锁大量行甚至全表,极易死锁。
  • MDL 隐式存在:DDL 与 DML 的 MDL 冲突是"改表卡住全站"的元凶。
  • 意向锁(IS/IX)是表级标志,用于快速判断表内是否有行锁,不与行锁冲突。

排查:MySQL 8 用 performance_schema.data_locks 看持有与等待,SHOW ENGINE INNODB STATUS 看死锁日志。RC 级别间隙锁大部分被关闭,这也是很多团队降 RC 的原因。

追问方向:next-key lock 的加锁规则(等值/范围、唯一/非唯一索引差异)、死锁案例复现。