标准答案

  1. 行锁通常锁定通过索引定位的记录,粒度较小但仍可能因扫描范围大而持有很多锁。
  2. 表锁适合某些引擎、DDL 或显式操作,冲突范围大,需特别关注维护窗口和在线变更行为。
  3. 意向锁表示事务准备在表内某些行加锁,使表级锁请求能快速判断是否存在冲突。
  4. 间隙锁锁住两个索引值之间的空隙,阻止符合范围的新记录插入。
  5. 临键锁可理解为记录锁与相邻间隙的组合,具体出现条件与引擎和隔离级别有关,应通过实际数据库文档验证。

题目解析

锁不是只按“代码写了 SELECT FOR UPDATE”才产生。UPDATE、DELETE、范围扫描、唯一性检查和 DDL 都可能参与锁竞争。没有合适索引时,原本想锁一行的操作可能扫描并锁住大量记录。

排查锁等待必须同时看 SQL、索引、事务时长和被阻塞链路。单独说“加了行锁”没有意义,真正要知道它锁住了什么范围、多久、谁在等谁。

常见误区

  • 认为按主键更新一定只影响一行,却忽略条件、触发器或外键检查可能扩大锁范围。
  • 把间隙锁视为所有数据库、所有隔离级别都完全相同的机制。

作者信息