跳到主要内容

锁类型与并发控制

InnoDB 常见锁与并发控制要点,含示例与排错思路。

锁类型

  • 记录锁(Record Lock):锁定某一行。
  • 间隙锁(Gap Lock):锁定两个记录之间的区间,阻止插入。
  • Next-Key 锁:记录锁 + 相邻间隙,避免 RR 下幻读。
  • 意向锁(IS/IX):表级,表明将获取某种行锁,便于锁兼容性判断。
  • 自增锁、插入意向锁:插入相关的内部锁。
  • 元数据锁(MDL):保护表结构变更与读写并发(DML 与 DDL 互斥)。

死锁与诊断

  • 死锁检测:InnoDB 自动检测并回滚代价较小的一方。
  • 诊断命令:
SHOW ENGINE INNODB STATUS\G; -- 最近一次死锁信息
  • 观察死锁环、加锁范围、索引选择(避免全表扫描导致大量行锁)。

示例:范围锁导致的冲突

会话 A:

START TRANSACTION;
SELECT * FROM orders WHERE amount > 100 FOR UPDATE; -- 大范围 Next-Key 锁

会话 B:

INSERT INTO orders(id, amount) VALUES(12345, 150); -- 可能被间隙锁阻塞

优化方向:缩小范围、改精确索引条件、必要时改 RC 并配合业务幂等控制幻读风险。

实务建议

  • where 谓词务必使用命中索引的等值或紧凑范围,减少锁范围。
  • 小心长事务与大范围 FOR UPDATE,优先短事务与拆批。
  • 线上开启合适的锁等待超时(innodb_lock_wait_timeout)。