InnoDB 的锁机制
InnoDB 的锁机制是 MySQL 实现事务隔离和数据一致性的关键组件。
锁的类型
共享锁(S锁)
- 作用:允许事务读取一行数据,阻止其他事务获取相同行的排他锁。
- 兼容性:多个事务可同时持有同一行的共享锁。
- 使用场景:如
SELECT ... LOCK IN SHARE MODE
语句。
排它锁(X锁)
- 作用:允许事务更新或删除数据,阻止其他事务对同一行加任何锁。
- 兼容性:与其他锁(包括S/X锁)互斥。
- 使用场景:如
UPDATE
、DELETE
或SELECT ... FOR UPDATE
语句。
锁的粒度
行级锁
- 直接锁定索引中的行记录,支持高并发。
- 记录锁(Record Locks):锁住索引记录(即使表无索引,InnoDB会创建隐藏聚簇索引)。
- 间隙锁(Gap Locks):锁定索引记录间的间隙,防止其他事务插入,仅作用于可重复读(RR)隔离级别。
- 临键锁(Next-Key Locks):记录锁 + 间隙锁,锁定左开右闭区间,解决幻读(RR隔离级别默认)。
表级锁(表级意向锁)
- 意向共享锁(IS):表示事务意图在表中某些行加S锁。
- 意向排他锁(IX):表示事务意图在表中某些行加X锁。
- 作用:快速判断表是否被锁定,避免逐行检查锁冲突。
自增锁
- 针对自增列的特殊表级锁,确保自增ID连续且唯一。
- 在语句执行完成后立即释放(非事务结束)。