有小伙伴在微信上表示面试时被问到了 Next-Key Lock 是啥,结果一脸懵逼,那么今天我们来捋一捋 MySQL 中的记录锁、间隙锁以及 Next-Key Lock。
1. Record Lock
Record Lock 也就是我们所说的记录锁,记录锁是对索引记录的锁,注意,它是针对索引记录,即它只锁定记录这一行数据。
例如如下一条 SQL:
select * from user where id=1 for update;
注意,id 是索引,id 如果不是索引,上面这条 SQL 所加的排他锁就不是一个 Record Lock。
我们来看如下一个例子:
首先我们将系统变量 innodb_status_output_locks 设置为 ON,如下:

接下来我们执行如下 SQL,锁定一行数据,此时会自动为表加上 IX 锁:

接下来我们在一个新的会话中执行如下指令来查看 InnoDB 存储引擎的情况:
show engine innodb status\G
输出的信息很多,我们重点关注 TRANSACTIONS,如下:

可以看到:
-
TABLE LOCK table test08.user trx id 3564804 lock mode IX:这句就是说事务 id 为 3564804 的事务,为 user 表添加了意向排他锁(IX)。 -
RECORD LOCKS space id 851 page no 3 n bits 80 index PRIMARY of table test08.user trx id 3564804 lock_mode X locks rec but not gap:这个就是一个锁结构的记录,这里的索引是 PRIMARY,加的锁也是正儿八经的记录锁(not gap)。
看到了 LOCKS REC BUT NOT GAP,就说明这是一个记录锁。
那么这个 Record Lock 和我们之前所讲的 S 锁以及 X 锁有什么区别呢?S 锁是共享锁,X 锁是排他锁,当我们加 S 锁或者 X 锁的时候,如果用到了索引,锁加在了某一条具体的记录上,那么这个锁也是一个记录锁(其实,记录锁,S 锁,X 锁,概念有一些重复的地方,但是描述的重点不一样)。
或者也可以理解为记录锁又细分为 S 锁和 X 锁,
MySQL记录锁、间隙锁与Next-Key Lock详解

本文详细介绍了MySQL中的记录锁、间隙锁和Next-Key Lock,包括它们的作用、实现方式以及如何防止幻读问题。在REPEATABLE READ隔离级别下,Gap Lock用于解决幻读,而Next-Key Lock是Record Lock和Gap Lock的结合,加锁规则遵循左开右闭原则,并在特定情况下会退化为Record Lock或Gap Lock。
最低0.47元/天 解锁文章
777





