MySQL 锁(二):间隙锁笔记

本文介绍了MySQL中在可重复读隔离级别下的间隙锁机制,强调了间隙锁之间的非冲突性和插入操作的阻塞情况。详细阐述了加锁规则,包括等值查询和范围查询下的锁行为,并提到了MySQL 8.0.18对唯一索引范围查询的优化。同时,对比了`SELECT ... LOCK IN SHARE MODE`和`SELECT ... FOR UPDATE`两种锁定方式及其对覆盖索引的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

MySQL:5.x 系列

前言

大部分知识点来自于,下面的文章:

21 | 为什么我只改一行的语句,锁这么多?

间隙锁

MySQL间隙锁在可重复读隔离级别下才有效。

间隙锁和读写锁的小区别

  • 间隙锁之间是不会冲突的,只有往间隙中插入数据的操作,才会被阻塞。
  • 这一点和我们平时认识的锁是不一样的,常见的锁被阻塞,一般都是被另一个锁引起的。

加锁规则

  1. 查找过程中访问到的对象才会加锁,加锁的基本单位是next-key lock(前开后闭);
  2. 等值查询:如果是唯一索引,next-key lock退化为行锁。如果不是唯一索引,需要向右遍历到最后一个值不满足等值条件为止,next-key lock退化为间隙锁。
  3. 范围查询:无论是不是唯一索引,都需要访问到 不满足条件的第一个值为止。(但是在MySQL8.0.18已经修复了唯一索引范围查询的bug,即:范围查询时,如果是唯一索引,不会访问到不满足条件的第一个值为止。)

上面是自己总结,下面是原文的说法

原文的说法

原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。

原则 2:查找过程中访问到的对象才会加锁。

优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。

优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。

一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。

知识点

select ... lock in share modeselect ... for update区别,参考:MySQL学习笔记:锁

select ... for update: 会对读取的行记录加一个X锁,其他事务不能对已锁定的行加上任何锁。另外,需要注意的是:如果当前索引使用的是覆盖索引,那么它除了锁覆盖索引之外,还会锁主键索引。

select ... lock in share mode: 对读取的行记录加一个S锁,其他事务可以向被锁定的行加S锁,但是如果加X锁,则会被阻塞。另外,需要注意的是:如果当前索引使用的是覆盖索引,那么它只锁覆盖索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值