【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?)

news2024/11/25 13:37:28

本文会按照 聚集集索->唯一索引->普通索引 的顺序 地毯式分析 范围查询中 <<=>>= 的行锁情况,锁表分析在唯一索引 章节,万字长文,力求分析全面,很硬核全网独一份,别忘了收藏 当然如果落下什么欢迎大家评论指出!

前文回顾

在上文,我们介绍了 MySQL InnoDB行锁的:

  • 2个模式:S锁和X锁
  • 3种算法:Record Lock、Gap Lock、Next-key Lock
  • 如何开启锁监视器如何分辨3种锁

并对等值查询3类索引 时,结合案例 说明了 都加了哪些锁 以及 为什么加这些锁的分析:

  • 聚集索引 和 唯一索引: Record Lock
  • 普通索引:Next-key Lock + Record Lock + Gap Lock
  • 无匹配:全是Gap Lock

详细案例分析和总结,请见上文:行锁 加锁规则 之 等值查询


文章目录

  • 前文回顾
  • 先说结论
  • 聚集索引
    • 小于
    • 小于等于
    • 大于
    • 大于等于
    • 范围组合
    • `聚集索引 小结`
  • 唯一索引
    • 小于
    • 小于等于
    • 大于
    • 大于等于
    • 范围组合
    • `唯一索引 小结`
  • 普通索引
    • 小于
    • 小于等于
    • 大于
    • 大于等于
    • 范围组合
    • `普通索引 小结`
  • 总结
  • 最后


先说结论

本文我们主要分析 范围查询,主要包括: <<=>>= 等.

文章很长,我先给出结论
聚集索引
对于 聚集索引下的范围查询 <、<=、>、>=,无论是否组合,都会遵循如下规则

  • 所有匹配的索引记录:只有>= 的等值(=)匹配 上Record Lock其它Next-key Lock;
  • 对于 < 和 <=向右扫描聚集索引,直到找到 不匹配 的 索引记录 上Next-key Lock.
  • 对于 > 和 >=,会对supremum (上界限伪值) 上Next-key Lock:锁的是 聚集索引 最大值 后面的 间隙;

唯一索引 和 普通索引:
对于 唯一索引 和 普通索引 下的范围查询 <、<=、>、>=,无论是否组合,都会遵循如下规则

  • 如果走了索引:
    • 在该索引上,所有匹配的 索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 对于 < 和 <=,会在该索引上向右扫描, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 对于 > 和 >=,会对supremum (上界限伪值) 上Next-key Lock:锁的是 该索引 最大值 后面的 间隙;
  • 如果没走索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

OK,给完结论,接着就让我们来验证吧 ,先看一看我们表中的数据:

+----+----------+-----+--------+--------+
| id | name     | abc | abc_uk | remark |
+----+--------- +-----+--------+--------+
| 10 | 巴西     |  10 |     10 | NULL   |
| 15 | 克罗地亚 |  10 |     15 | NULL   |
| 20 | 阿根廷   |  20 |     20 | NULL   |
| 30 | 葡萄牙   |  30 |     30 | NULL   |
| 40 | 法国     |  40 |     40 | NULL   |
+----+----------+-----+--------+--------+
5 rows in set (0.02 sec)

id :自增主键
abc :普通索引
abc_uk :唯一索引

新打开一个mysql客户端,我们叫Session1,并开启锁监视器:

SET GLOBAL innodb_status_output=ON;
SET GLOBAL innodb_status_output_locks=ON;

说明,本文基于:MySQL5.7、InnoDB引擎、可重复读事务隔离级别


聚集索引

小于

新打开一个mysql客户端,我们叫Session2, 执行SQL如下(按id < 20):

begin;
update ct set remark = '巴西 爆冷 克罗地亚' 
where id < 20;

注意不要commit或rollback,以便于我们分析行锁

这里匹配id < 20 的 记录有两条:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bacea057d038408bbce106054cd8c5a2.png
然后我们在Session1里查看锁的详细信息

show engine innodb status\G; 

我们还是主要看TRANSACTIONS这段,如下图:
在这里插入图片描述

这里上了 3 把锁,因为是 按id,所以全锁在 聚集索引 上:

  1. id = 20 (向右扫描到的第一个不匹配记录): Next-key Lock;
  2. id = 10(匹配记录) : Next-key Lock;
  3. id = 15(匹配记录) : Next-key Lock;

因为 20 刚好是临界值。如果我们换成 id < 19呢?

update ct set remark = '巴西 爆冷 克罗地亚' 
where id < 19;

再来看一下:

show engine innodb status\G; 

在这里插入图片描述
结果依旧!!!(你可以对比一下:上一个事务ID是:793365):
还有一个临界值 id < 16

update ct set remark = '巴西 爆冷 克罗地亚' 
where id < 16;

结果也是一样的,就不展示了。

所以对于 < 在 聚集索引 上来说,我们得出的结果是:

  • 聚集索引上, 所有匹配的 索引记录 上Next-key Lock;
  • 向右扫描聚集索引, 直到找到 [不匹配的索引记录] 上Next-key Lock.

小于等于

这里依旧演示两个临界值: id <=19 和 id <= 20

begin;
update ct set remark = '巴西 爆冷 克罗地亚' 
where id <= 19;

这里匹配记录有 id =10 和 id =15 两条记录。

我们来看一下:

show engine innodb status\G; 

在这里插入图片描述
不出所料,因为 和 id < 19 的匹配记录是相同的,所以锁的结果也是相同的!
我们再来看一下临界值 id <=20:

begin;
update ct set remark = '巴西 爆冷 克罗地亚' 
where id <= 20;

我们看一下修改的记录,共3条:
在这里插入图片描述
这里对于 3条匹配的 索引记录,上Next-key Lock已尽在我们掌握中,但id = 30 是否会上锁?
如果上的话,是上 Next-key Lock 还是Gap Lock?

我们来看一下:

show engine innodb status\G; 

在这里插入图片描述
可以看出上了4把锁:3条已匹配记录上了Next-key Lock,向右查找到不匹配的30也上了Next-key Lock。
其实这里不知道你会不会有这个 疑问 :对于聚集索引来说,值是唯一的,既然已经匹配到最大的20了,中止是不是更好?为什么还要继续向右?
如果是<=21,因为21不存在,所以需要继续向右扫描直到查找到30,上一把Next-key Lock倒可以理解!

其实疑问早就存在,前腾讯云数据库负责人林晓斌还曾找社区专家讨论过,官方bug系统上也有提到,但是并未被verified,所以这个也被他称之为bug!

对于 <= 在 聚集索引 上来说,我们得出的结果是(实际和 < 一样):

  • 聚集索引上, 所有匹配的 索引记录 上Next-key Lock;
  • 向右扫描聚集索引, 直到找到 [不匹配的索引记录] 上Next-key Lock.

大于

我们再来验证 id > 10:

update ct set remark = '巴西 爆冷 克罗地亚' 
where id > 10;

这时匹配的记录有 15、20、30、40,所以会上4把Next-key Lock,对于40后的间隙,是对supremum上了Next-key Lock,这个很好理解,没什么特殊的,请看下图:
在这里插入图片描述
对于 > 在 聚集索引 上来说,我们得出的结果是(实际和 <, <= 类似):

  • 聚集索引上, 所有匹配的 索引记录 上Next-key Lock;
  • supremum (上界限伪值) 上Next-key Lock:锁的是最大值后的间隙;

大于等于

我们最后来看一下 id >= 10,这个有点特殊

update ct set remark = '巴西 爆冷 克罗地亚' 
where id >= 10;

在这里插入图片描述

对于 >= 我们得到的结果是:

  • 聚集索引上, 所有 > 的 索引记录 上Next-key Lock;
  • 聚集索引上, 等值(=) 会上Record Lock,当然:如果没有 等值(=) 就不会上锁,我已验证 id>=11,比较好理解,不做赘述!
  • supremum (上界限伪值) 上Next-key Lock:锁的是最大值后的间隙;

范围组合

范围组合一: > <

update ct set remark = '匹配15' 
where id > 10 and id < 20;

在这里插入图片描述
由图可知,对2条索引记录上锁:匹配:15,next-key:20
结果

  • 聚集索引上, 所有匹配的 索引记录 上Next-key Lock;
  • 向右扫描聚集索引, 直到找到 [不匹配的索引记录] 上Next-key Lock.

范围组合二: > <=

update ct set remark = '匹配15 + 20' 
where id > 10 and id <= 20;

在这里插入图片描述
由图可知,对3条索引记录上锁:匹配:15、20,next-key:30

结果 和> <相同,不做赘述!

范围组合三: >= <

update ct set remark = '匹配10 + 15' 
where id >= 10 and id < 20;

在这里插入图片描述
由图可知,对3条索引记录上锁:匹配:10、15,next-key:20
结果

  • 只有 >= 的等值(=)匹配索引记录上Record Lock,其它匹配的 索引记录 上Next-key Lock;
  • 向右扫描 直到找到 不匹配 的 索引记录 上Next-key Lock.

范围组合四: >= <=

update ct set remark = '匹配10 + 15 + 20' 
where id >= 10 and id <= 20;

在这里插入图片描述
由图可知,对4条索引记录上锁:匹配:10、15、20,next-key:30
结果 和>= <相同,不做赘述!

聚集索引 小结

对于 聚集索引下的范围查询 <、<=、>、>=,无论是否组合,都会遵循如下规则:

  • 所有匹配的索引记录:只有>= 的等值(=)匹配 上Record Lock其它Next-key Lock;
  • 对于 < 和 <=向右扫描聚集索引,直到找到 不匹配 的 索引记录 上Next-key Lock.
  • 对于 > 和 >=,会对supremum (上界限伪值) 上Next-key Lock:锁的是 聚集索引 最大值 后面的 间隙;

唯一索引

小于

我们在Session2 执行SQL如下(按abc_uk < 20):

update ct set remark = '巴西 爆冷 克罗地亚' 
where abc_uk < 20;

在这里插入图片描述
这里共匹配2条记录:abc_uk = 10 和 abc_uk = 15。

共上了 6 把锁,3把锁在唯一索引上:

  1. abc_uk = 20 (向右扫描到的第一个不匹配记录): Next-key Lock;
  2. abc_uk = 10(匹配记录) : Next-key Lock;
  3. abc_uk = 15(匹配记录) : Next-key Lock;

3把锁在聚集索引上:

  1. id = 20 (向右扫描到的第一个不匹配记录): Record Lock;
  2. id = 10(匹配记录) : Record Lock;
  3. id = 15(匹配记录) : Record Lock;

到这,我猜你肯定认为 和 聚集索引 一样有结果了,请看好了,好戏即将上演~
我改下sql,sql语句本身没变,只是 20换成30:

update ct set remark = '巴西 爆冷 克罗地亚' 
where abc_uk < 30;

这里共匹配3条记录,分别是abc_uk = 10 、15、20。
我们看一下锁监视器:
在这里插入图片描述
这里对聚集索引上了6把锁!!!
表里所有的5条聚集索引记录都上了Next-key Lock,还把supremum上了Next-key Lock。

你是不是会怀疑我搞错了?

那咱们走着瞧~,咱们先看一下explain的结果:
在这里插入图片描述
possible_keys: uk_abc_uk,意思说可能走的索引是uk_abc_uk
key:PRIMARY,意思说实际走的索引是聚集索引
type:index,意思说扫描了整个索引树

所以:这条SQL并没有使用唯一索引,而使用的是全表扫描
这里其实是索引相关的知识,也就是索引失效了,实际是通过索引成本计算,得出全表扫描的cost(3.9) 小于唯一索引再回表的cost(4.61):
在这里插入图片描述
全表扫描的成本计算(上图):

  • I/0成本:1*1.0+1.1 = 2.1
  • CPU成本:4*0.2+1.0 = 1.8
  • 总成本:I/0成本(2.1)+CPU成本(1.8) = 3.9

在这里插入图片描述
使用唯一索引的成本计算(上图):

  • I/0成本1 - 范围区间的数量: 1 * 1.0 = 1.0
  • I/0成本2 - 回表成本:3 * 1.0 = 3.0
  • CPU成本:3 * 0.2 + 0.01 = 0.61
  • 总成本:I/0成本(4.0)+CPU成本(0.61) = 4.61

说白了,就是表里一共才5条记录,这个范围就匹配了3条记录,我用唯一索引先查id,再用id回表去修改,还不如直接遍历全表来的快!!!
实际项目里,表里的数据一般不会这么少,所以这个示例的修改占比(60%)还是很高的,所以才造成了全表扫描(全表成本低于使用索引)。

对于索引要细说的话内容很多,远没有这么简单,这里只是简单说明,不懂不要紧,先作为了解,后面再安排细聊索引的成本计算

安排结果!对于 < 在 唯一索引 上来说,我们得出的结果是:

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 向右扫描该索引,直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock;
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

小于等于

update ct set remark = '巴西 爆冷 克罗地亚' 
where abc_uk <= 19;

在这里插入图片描述
不出所料,因为 和 abc_uk < 20 的匹配记录是相同的,所以锁的结果也是相同的!

我们再来看一下临界值 abc_uk <=20:

begin;
update ct set remark = '巴西 爆冷 克罗地亚' 
where abc_uk <= 20;

这里依然是会影响到3条记录 abc_uk = 10、15、20,所以你懂的,又锁表了!!! 具体就不截图了。

所以我们改成范围小一点的临界值 abc_uk <=15:

begin;
update ct set remark = '巴西 爆冷 克罗地亚' 
where abc_uk <= 15;

这里只会影响到2条记录 abc_uk = 10、15

我们来看一下:

show engine innodb status\G; 

在这里插入图片描述
这里共匹配2条记录:abc_uk = 10 和 abc_uk = 15。

共上了 6 把锁,3把锁在唯一索引上:

  1. abc_uk = 20 (向右扫描到的第一个不匹配记录): Next-key Lock;
  2. abc_uk = 10(匹配记录) : Next-key Lock;
  3. abc_uk = 15(匹配记录) : Next-key Lock;

3把锁在聚集索引上:

  1. id = 20 (向右扫描到的第一个不匹配记录): Record Lock;
  2. id = 10(匹配记录) : Record Lock;
  3. id = 15(匹配记录) : Record Lock;

综上,对于 <= 在 聚集索引 上来说,我们得出的结果 实际和 < 一样,不做赘述!

大于

我们先来验证 abc_uk > 10:

update ct set remark = '阿根廷 3:0 克罗地亚' 
where abc_uk > 10;

这里共匹配4条记录:abc_uk = 15、20、30、40,所以你懂的,又锁表了!!! 具体就不截图了。

所以我们改成范围小一点的 abc_uk > 20:

update ct set remark = '阿根廷 3:0 克罗地亚' 
where abc_uk > 20;

这里只会影响到2条记录 abc_uk = 30、40

我们来看一下:

show engine innodb status\G; 

在这里插入图片描述
这里共匹配2条记录:abc_uk = 30 和 abc_uk = 40。

共上了 5把锁,3把锁在唯一索引上:

  1. abc_uk = supremum (上界限伪值,锁的是最大值后的间隙): Next-key Lock;
  2. abc_uk = 30(匹配记录) : Next-key Lock;
  3. abc_uk = 40(匹配记录) : Next-key Lock;

2把锁在聚集索引上:

  1. id = 30(匹配记录) : Record Lock;
  2. id = 40(匹配记录) : Record Lock;

对于 > 在 唯一索引 上来说,我们得出的结果是(实际和 <, <= 类似):

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 在该索引上,对supremum (上界限伪值) 上Next-key Lock:锁的是最大值后的间隙;
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

大于等于

因为 abc_uk >= 10匹配了所有记录,所以你懂的,又锁表了!!! 具体就不截图了。

我们直接来看不锁表的 abc_uk >= 30

update ct set remark = '阿根廷 3:0 克罗地亚' 
where abc_uk >= 30;

在这里插入图片描述
从上图可知,abc_uk >= 30 和 abc_uk > 20 上的锁是一样的,并不像 id >= 时那样将匹配值优化为Record Lock。

所以,对于 >= 我们得到的结果 实际和 > 一样,不做赘述!

范围组合

说明:索引失效 会 锁表 的规则是通用的,所以这里就 统一 只演示 不锁表 的情况。

范围组合一: > <

update ct set remark = '格子军团' 
where abc_uk > 10 and abc_uk < 20;

在这里插入图片描述
不出所料,由图可知,对 2条唯一索引 和对应的 2条聚集索引 上锁:匹配:15,next-key:20

结果:(和单个规则相同)

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 向右扫描该索引, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock.
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

范围组合二: > <=

update ct set remark = '格子军团' 
where abc_uk > 10 and abc_uk <= 20;

》TODO
不出所料,由图可知,对 3条唯一索引 和对应的 3条聚集索引 上锁:匹配:15、20,next-key:30

结果:(和单个规则相同)

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 向右扫描该索引, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock.
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

范围组合三: >= <

update ct set remark = '梅西加油' 
where abc_uk >= 10 and abc_uk < 20;

在这里插入图片描述

不出所料,由图可知,对 3条唯一索引 和对应的 3条聚集索引 上锁:匹配:10、15,next-key:20
结果:(和单个规则相同)

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 向右扫描该索引, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock.
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

范围组合四: >= <=

update ct set remark = '梅西加油' 
where abc_uk >= 10 and abc_uk <= 15;

在这里插入图片描述
不出所料,由图可知,对 3条唯一索引 和对应的 3条聚集索引 上锁:匹配:10、15,next-key:20
结果:(和单个规则相同)

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 向右扫描该索引, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock.
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

唯一索引 小结

对于 唯一索引下的范围查询 <、<=、>、>=,无论是否组合,都会遵循如下规则:

  • 如果走了唯一索引:
    • 在该索引上,所有匹配的 索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 对于 < 和 <=,会在该索引上向右扫描, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 对于 > 和 >=,会对supremum (上界限伪值) 上Next-key Lock:锁的是 该索引 最大值 后面的 间隙;
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

普通索引

说明:索引失效 会 锁表 的规则是通用的,所以这里就 统一 只演示 不锁表 的情况。

小于

我们在Session2 执行SQL如下(按abc < 20):

update ct set remark = '梅西加油' 
where abc < 20;

在这里插入图片描述

这里共匹配2条abc=10的记录。

所以共上了 6 把锁,3把锁在普通索引上:

  1. abc = 20 (向右扫描到的第一个不匹配记录): Next-key Lock;
  2. abc = 10,id = 10(匹配记录) : Next-key Lock;
  3. abc = 10,id = 15(匹配记录) : Next-key Lock;

3把锁在聚集索引上:

  1. id = 20 (向右扫描到的第一个不匹配记录): Record Lock;
  2. id = 10(匹配记录) : Record Lock;
  3. id = 15(匹配记录) : Record Lock;

可以看出:和唯一索引上锁规则没什么两样!

锁表只需要把范围扩大就可以复现,比如:

update ct set remark = '梅西加油' 
where abc < 30;

所以,对于 < 在 普通索引 上来说,我们得出的结果是(和唯一索引的 < 相同):

  • 如果走了普通索引:
    • 在该索引上,所有匹配的 索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 向右扫描该索引,直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock.
  • 如果没走普通索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

小于等于

update ct set remark = '梅西加油' 
where abc <= 19;

在这里插入图片描述
不出所料,因为 和 abc < 20 的匹配记录是相同的,所以锁的结果也是相同的!

所以,对于 <= 在 普通索引 上来说,我们得出的结果:实际和 < 一样,不做赘述.

大于

update ct set remark = '梅西加油' 
where abc > 20;

在这里插入图片描述

这里共匹配2条记录:abc = 30、40

共上了 5把锁,3把锁在普通索引上:

  1. abc = supremum (上界限伪值,锁的是最大值后的间隙): Next-key Lock;
  2. abc = 30(匹配记录) : Next-key Lock;
  3. abc = 40(匹配记录) : Next-key Lock;

2把锁在聚集索引上:

  1. id = 30(匹配记录) : Record Lock;
  2. id = 40(匹配记录) : Record Lock;

对于 > 在 普通索引 上来说,我们得出的结果是(实际和唯一索引的相同):

  • 如果走了普通索引:
    • 在该索引上,所有匹配的 索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 在该索引上,对supremum (上界限伪值) 上Next-key Lock:锁的是最大值后的间隙;
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

大于等于

update ct set remark = '梅西加油' 
where abc >= 30;

在这里插入图片描述

从上图可知,abc >= 30 和 abc > 20 的上锁是一样的,和唯一索引规则相同,并不像id>=时那样将匹配值优化为Record Lock。

所以,对于 >= 在 普通索引 上来说,我们得出的结果:实际和 > 一样,不做赘述.

范围组合

范围组合一: > <

update ct set remark = '格子军团' 
where abc > 10 and abc < 20;

在这里插入图片描述
不出所料,由图可知,无匹配记录,所以只对next-key:abc=20以及对应的id = 20上了锁

结果:(和单个规则相同)

  • 如果走了普通索引:
    • 在该索引上,所有匹配的 索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 在该索引上,向右扫描 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock.
  • 如果没走唯一索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

因为其它范围组合实际都和单个规则相同,所以不做赘述!

普通索引 小结

对于 普通索引下的范围查询 <、<=、>、>=,无论是否组合,都会遵循如下规则:

  • 如果走了普通索引:
    • 在该索引上,所有匹配的 索引记录 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 对于 < 和 <=,会在该索引上向右扫描, 直到找到 [不匹配的索引记录] 上Next-key Lock,对应的聚集索引 上Record Lock;
    • 对于 > 和 >=,会对supremum (上界限伪值) 上Next-key Lock:锁的是 该索引 最大值 后面的 间隙;
  • 如果没走普通索引,那么就会把所有 聚集索引记录 和 间隙 都锁上,就是所谓的锁表,或叫行锁升表锁.

总结

这里需要补充说明的是:因为对于范围查询,都会有个边界,所以如果没有任何匹配,就会只对边界加锁,规则不变!

结论开篇就给出了,结论传送门.

最后

如果感觉不错,请收藏本专栏,后面还有更详细的锁机制陆续放出。
关注我 天罡gg 分享更多干货: https://blog.csdn.net/scm_2008
大家的「关注 + 点赞 + 收藏」就是我创作的最大动力!谢谢大家的支持,我们下文见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中学课程辅导杂志中学课程辅导杂志社中学课程辅导编辑部2022年第34期目录

教育视点《中学课程辅导》投稿&#xff1a;cn7kantougao163.com 基于整体英语教学理念的初中英语读写课研究 徐杰; 3-5 初中语文阅读教学的有效追问策略 徐生; 6-8 初中音乐教学中融入美育的实践探讨 张静; 9-11 “让学引思”理念下的初中物理高效课堂构建 张敏…

部署Neo4j +Rasa+Rasa UI

一、前言 最近在学习kbqa&#xff0c;调研时发现gitee上有关于多轮对话系统源码&#xff0c;该仓库主要是基于rasa框架&#xff08;python语言&#xff09;实现&#xff0c;并且带有web的UI配置&#xff0c;相当于比较全面的对话平台。Rasa UI 可以基于客户已有的平台&#xf…

西电雨课堂测试大合集【导航】

文章目录基础写作 一、二科学道德与学风研究生的压力与心理健康学术规范与论文写作中国传统文化✨感谢各位博主的分享&#xff01; &#x1f4d2;我在这里只是进行了一些整理&#xff0c;方便大家查找。 ⚠️大家看完可以给博主们点点赞、收藏、关注。&#x1f601; 祝各位学业…

Linux机器安装Nginx配置并实现双向认证

Linux机器安装Nginx配置并实现双向认证 一.Nginx的安装配置 Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的…

TiDB | TiDB在5A级物流企业核心系统的应用与实践

TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最后前言 历经了近半年的测试验证和迁移准备&#xff0c;神州金库3.0核心系统 WMS 正式从 MyS…

力扣(LeetCode)152. 乘积最大子数组(C++)

序列dp f[i]f[i]f[i] 表示以 iii 结尾的连续子数组的最大乘积&#xff0c;d[i]d[i]d[i] 表示以 iii 结尾的连续子数组的最小乘积 。 如果只有正数&#xff0c;我们只需要考虑最大乘积 f[i]f[i]f[i] &#xff1b;有负数&#xff0c;需要考虑与负数相乘的数&#xff0c;越小越好…

【unity】基础交互入门(碰撞交互事件OnTriggerEnter和OnCollisionEnter)

一、碰撞交互事件OnTriggerEnter 1、在场景中添加两个几何体&#xff08;例如Cube和Sphere&#xff09; 2、添加Rigidbody&#xff08;刚体&#xff09;component 点击Cube&#xff08;正方体&#xff09;对象&#xff0c;在面板找到这个按钮&#xff0c;添加component 搜索…

Zabbix6.0使用教程 (五)—zabbix从二进制包安装上篇

大家好&#xff0c;我是乐乐。上一期我们已经讲过从源代码安装zabbix&#xff0c;本期着重讲从二进制包安装zabbix。 当我们在ZABBIX官方存储库可以看到&#xff0c;Zabbix SIA 提供如下官方RPM和DEB包&#xff1a; Red Hat Enterprise Linux/CentOS Debian/Ubuntu/Raspbian …

即时通讯音视频开发编码H.264的特点与优势

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 国际上制定视频编解码技术的组织有两个&#xff0c;一…

[附源码]Python计算机毕业设计SSM基于Java的运动健身平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

博客网页设计制作 简单静态HTML网页作品 DIV CSS个人网页作业成品 dreamweaver学生个人博客网站模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Mentor-dft 学习笔记 day42-ASCII File Format(2)

FORCE “primary_input_pin” <value> <time>; 此命令用于在给定时间强制选定主输入引脚上的值&#xff08;0,1、X或Z&#xff09;。时间值不得低于该程序的先前时间值。每个程序的时间在时间0再次开始。主输入引脚将用双引号括起来。APPLY “scan_group_procedure…

高通Ride软件开发包使用指南(10)

高通Ride软件开发包使用指南&#xff08;10&#xff09;7 平台管理任务7.1 连接到控制台7.1.1 串口连接SOC1和SOC27.1.2 识别 SOC1 或 SOC 27.1.3 识别平台构建7.1.4 串口连接SA9000P7.1.5 通过串口连接到 Aurix7.2 在 SIP1 和 SIP2 上为 SA8xxxP 分配 IP 地址7.2.1 分配静态 I…

【数据预处理机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究

文章目录一.需求背景二. 任务开始2.1 薪酬的中位数、均值和众数和数据倾斜模块详细设计2.2 按不同的类别划分职位中的薪酬数据&#xff0c;画盒图/箱线图&#xff0c;检查孤立点/离群点一.需求背景 课题中心&#xff1a;招聘网站的职位招聘数据预处理 之前的文章&#xff0c;…

【JAVA】final关键字

&#x1f3c6;今日学习目标&#xff1a;final关键字 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰本期期数&#xff1a;第一期 &#x1f389;专栏系列&#xff1a;JAVA 文章目录前言final关键字final关键字修饰类示例&#xff1a;fin…

[附源码]Python计算机毕业设计高校社团管理平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

笔试强训(四十五)

目录一、选择题二、编程题2.1 查找兄弟单词2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;IP数据报分片的重组通常发生在&#xff08;D&#xff09; A.源主机和数据经过的路由器上 B.源主机上 C.数据报经过的路由器上 D.目的主机上 数据分片是网络层发现上层给的数…

Java反射(通俗易懂!)

文章目录2.反射2.1反射的概述2.2 获取 Class类对象的三种方式2.3反射获取构造方法并使用2.3.1Class 类获取构造方法对象的方法2.3.2Constructor类用于创建对象的方法2.3.3小结2.4反射获取成员变量并使用2.4.1Class类获取成员变量对象的方法2.4.2Field类用于给成员变量赋值的方法…

木字楠后台管理系统开发(5):Vue登陆界面编写以及与后台联调测试

&#x1f3b6; 文章简介&#xff1a;木字楠后台管理系统开发(5)&#xff1a;Vue登陆界面编写以及与后台联调测试 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;愿冷空气冷藏你的烦恼,让快乐永驻。 &…

PaddleX API开发模式快速上手文档

目录一. 环境安装1.1 PaddlePaddle-gpu安装1.2 PaddleX安装二. 快速训练2.1 准备数据集2.2 定义图像预处理与数据增强2.3 定义并装载数据2.4 开始训练2.5 使用Visual查看训练情况三. 部署推理3.1 模型加载预测PaddleX官方文档(以图像分类为例)&#xff1a;PaddleX/docs/quick_s…