背景
本文旨在帮助读者了解数据库锁的类型、特性以及数据库的加锁的原则,方便于各类复杂场景下的死锁问题的分析和解决。
锁类型
加锁颗粒度:
- 表锁

- 行锁
加锁机制:
锁兼容性
- 共享锁 S (lock in share model) lock in share mode 只锁覆盖索引
- 排他锁 X (select ... for update) for update 锁覆盖索引 + 主键索引
锁详细类型
记录锁
间隙锁 (Gap Lock)
临键锁 next-key lock
意向锁
插入意向锁
metadata lock
主键锁
锁状态分析
加锁范围
RR 隔离级别加锁原则
原则1 :加锁的基本单位都是next-key lock。next-key lock(临键锁)是前开后闭区间。
原则2 : 访问到的对象才会加锁
优化1 :
优化2 :索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁(Gap lock)。
一个bug: 唯一索引上的范围查询会访问到不满足条件的第一个值为止。
死锁分析思路
通过多终端模拟并发事务,复现死锁;
通过 show engine innodb status; 可以查看事务与锁的信息;
通过 explain 可以查看执行计划;