【MySQL】记录锁?间隙锁?临键锁?到底锁了些什么?这一篇帮你捋清楚( ̄∇ ̄)/
MySQL中的锁主要分为三种类型:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-Key Lock)。
- 记录锁(Record Lock):锁定单个行记录。
- 间隙锁(Gap Lock):锁定一个范围,但不包括索引的具体值。用于防止幻读。
- 临键锁(Next-Key Lock):结合了记录锁和间隙锁,锁定一个范围,并且锁定记录本身。
举例说明:
假设有一个索引为(a)的表,其中a列有值1, 3, 5, 7。
- 记录锁:如果SQL语句为
SELECT * FROM table WHERE a = 3 FOR UPDATE;
,则锁定值为3的记录。 - 间隙锁:如果SQL语句为
SELECT * FROM table WHERE a BETWEEN 2 AND 4 FOR UPDATE;
,则锁定2<a<4的范围,但不包括3。 - 临键锁:如果SQL语句为
SELECT * FROM table WHERE a > 2 FOR UPDATE;
,则锁定2<a的所有值的范围,并锁定大于2的最小的一个值的记录。
这样锁定可以防止其他事务在这些范围内进行插入,从而防止幻读。
注意:间隙锁和临键锁主要用于事务隔离级别为可重复读(REPEATABLE READ)或以上级别。在读已提交(READ COMMITTED)隔离级别下,InnoDB默认不会使用间隙锁和临键锁,只在需要时使用记录锁。
评论已关闭