InnoDB行锁、间隙锁与Next-Key Lock详解
请详细解释MySQL InnoDB中的锁机制:行锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock)和意向锁(Intention Lock)。它们分别在什么情况下加锁?如何避免死锁?
回答
我还是少年
锁类型详解:
-
Record Lock(行锁):锁定索引记录,只锁行本身
- 场景:
SELECT ... FOR UPDATE或UPDATE ... WHERE id=1
- 场景:
-
Gap Lock(间隙锁):锁定索引记录之间的间隙,防止其他事务插入
- 场景:RR隔离级别下,范围查询未命中行时锁住间隙
- 如:
SELECT * FROM t WHERE id BETWEEN 10 AND 20 FOR UPDATE,若10和20之间无记录,则锁住(10,20)间隙 - 作用:防止幻读
-
Next-Key Lock(临键锁) = Record Lock + Gap Lock
- 锁定一个左开右闭区间(如(10,20])
- 是InnoDB RR级别下默认的行锁算法
-
Intention Lock(意向锁):
- 意向共享锁(IS):事务准备给某些行加共享锁
- 意向排他锁(IX):事务准备给某些行加排他锁
- 用于快速判断表锁和行锁的兼容性,无需逐行检查
死锁避免:
- 保持一致的加锁顺序
- 尽量使用RC隔离级别(间隙锁少)
- 缩短事务时长
- 使用等值查询走唯一索引(只加行锁,不加间隙锁)
- innodb_deadlock_detect检测死锁自动回滚代价小的事务