本文主要是介绍MySQL 锁(二):间隙锁笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境
MySQL:5.x 系列
前言
大部分知识点来自于,下面的文章:
21 | 为什么我只改一行的语句,锁这么多?
间隙锁
MySQL间隙锁在可重复读隔离级别下才有效。
间隙锁和读写锁的小区别
- 间隙锁之间是不会冲突的,只有往间隙中插入数据的操作,才会被阻塞。
- 这一点和我们平时认识的锁是不一样的,常见的锁被阻塞,一般都是被另一个锁引起的。
加锁规则
- 查找过程中访问到的对象才会加锁,加锁的基本单位是
next-key lock
(前开后闭); - 等值查询:如果是唯一索引,
next-key lock
退化为行锁。如果不是唯一索引,需要向右遍历到最后一个值不满足等值条件为止,next-key lock
退化为间隙锁。 - 范围查询:无论是不是唯一索引,都需要访问到 不满足条件的第一个值为止。(但是在MySQL
8.0.18
已经修复了唯一索引范围查询的bug,即:范围查询时,如果是唯一索引,不会访问到不满足条件的第一个值为止。)
上面是自己总结,下面是原文的说法
原文的说法
原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。
原则 2:查找过程中访问到的对象才会加锁。
优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。
知识点
select ... lock in share mode
和select ... for update
区别,参考:MySQL学习笔记:锁
select ... for update
: 会对读取的行记录加一个X锁,其他事务不能对已锁定的行加上任何锁。另外,需要注意的是:如果当前索引使用的是覆盖索引,那么它除了锁覆盖索引之外,还会锁主键索引。
select ... lock in share mode
: 对读取的行记录加一个S锁,其他事务可以向被锁定的行加S锁,但是如果加X锁,则会被阻塞。另外,需要注意的是:如果当前索引使用的是覆盖索引,那么它只锁覆盖索引。
这篇关于MySQL 锁(二):间隙锁笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!