一条只更新一行订单的语句,为什么会等待几十秒?问题通常不在语句执行得慢,而在它需要的锁被另一个尚未结束的事务占着。
这一集从真实的订单更新超时出发,讲清 InnoDB 实际锁住的是索引记录和索引范围,索引缺失为什么会扩大加锁范围,以及锁等待与死锁应当如何定位和处理。
重点内容:
- 更新语句为什么需要排他锁
- 行锁为什么本质上锁在索引记录上
- 缺少索引如何扩大扫描和加锁范围
- 记录锁、间隙锁与临键锁分别保护什么
- 锁等待和死锁有什么区别
- 为什么死锁事务必须允许重试
- 如何定位阻塞者,而不是只处理等待者
英文词对照:
- Record Lock:记录锁
- Gap Lock:间隙锁
- Next-Key Lock:临键锁
- Exclusive Lock:排他锁
- Lock Wait:锁等待
- Deadlock:死锁
- Blocking Transaction:阻塞事务
- Lock Wait Timeout:锁等待超时

