1. 行级锁(Row-Level Lock)
-
支持引擎:InnoDB 支持,MyISAM 不支持。
-
核心特点:
- 锁的粒度是行,并发性能远高于表锁。
- 必须依赖索引:如果查询没有命中索引,InnoDB 会退化为表锁,导致并发性能急剧下降。
- 是 InnoDB 支持高并发事务的核心基础。
2. 记录锁(Record Lock)
-
定义:精准锁定表中的一条具体记录(行)。
-
锁的类型:
- S锁(共享锁/读锁) :多个事务可以同时持有同一行的S锁,用于读取数据,互不阻塞。
- X锁(排他锁/写锁) :同一时间,只有一个事务能持有某行的X锁,用于修改数据。
-
兼容性规则:
- S锁与S锁兼容(读读不互斥)。
- S锁与X锁互斥(读写互斥)。
- X锁与任何锁都互斥(写写互斥)。
-
典型场景:
UPDATE ... WHERE id = ?或SELECT ... FOR UPDATE时,InnoDB 会对命中的行加X锁。
3. 间隙锁(Gap Lock)
- 存在条件:只在 InnoDB 的**可重复读(RR)**隔离级别下存在。
- 核心目的:解决 RR 隔离级别下的幻读问题。
- 锁定对象:锁定的是索引记录之间的“空隙” ,而不是记录本身。
- 作用:防止其他事务在这个间隙中插入新数据,从而保证在同一个事务内,多次查询的结果集行数一致。
- 示例:如果表中有 id=1 和 id=3 的记录,执行
SELECT * FROM t WHERE id BETWEEN 1 AND 3 FOR UPDATE,InnoDB 会锁定 (1, 3) 这个间隙,阻止其他事务插入 id=2 的新记录。
4. 临键锁(Next-Key Lock)
- 定义:是 记录锁 + 间隙锁 的组合,是 InnoDB 在 RR 隔离级别下的默认行锁算法。
- 锁定范围:锁定一个左开右闭的区间,既锁定区间内的记录,也锁定记录前的间隙。
- 作用:彻底解决幻读问题,同时保证数据的一致性。
- 示例:对于索引值 10,其对应的 Next-Key Lock 区间是 (5, 10]。这意味着它会锁定所有大于5且小于等于10的范围,防止新数据插入到这个区间内。
总结一下它们的关系
- 行级锁是一个大的概念,包含了记录锁、间隙锁和临键锁。
- 记录锁是锁定单行,间隙锁是锁定空隙,而临键锁是两者的结合,是 InnoDB 解决幻读的核心手段。
要不要我帮你画一张这几种锁的关系和作用的思维导图,让你一眼看懂它们的区别和联系?