MySQL 间隙锁

之前一直对间隙锁的锁定范围很迷糊,感觉不可控,最近又看了下相关文章,再加上测试,发现间隙锁真的只是顾名思义,间隙锁就是间隙锁。

MySQL 版本:8.0.28

先说结论,间隙锁只会在语句用到的索引上添加,不管这个是辅助索引还是聚集索引。所以会有如下的场景:

  1. 使用主键,等值查询,不会加间隙锁
  2. 使用主键,范围查询,加间隙锁
  3. 使用唯一索引,等值查询,不加间隙锁
  4. 使用唯一索引,范围查询,在唯一索引上加间隙锁
  5. 普通索引,等值查询,加间隙锁
  6. 普通索引,范围查询,加间隙锁
  7. 普通索引,会对索引的全部范围加间隙锁,从而无法对这个表再进行修改

举个例子,有如下的 student 表

表中有4条记录,

则,对于age字段的索引 idx_age 而言,其值包括如下

age   id 

12      3

16      7

23      5

43      10

在辅助索引中,值的排序是先根据索引字段,然后再按主键排序,所以上面的顺序就是该索引值的顺序。所以对于 (16, 7) 这一值而言,他的左右间隙分别是 (12, 3)和(23, 5),若有查询语句如下

SELECT * FROM student WHERE age = 16 FOR UPDATE

则 (12, 3) < x <= (23, 5) 的范围内都会被加锁,也就意味着,如下的组合是无法写入的

age = 12, id = 4

age = 12, id = 100

age = 20, id = 54

.....

具体加的锁可以通过查询 performance_schema.data_locks 表,如下所示

可以很清晰的看到,加的锁包括

  1. 意向排他锁
  2. 主键索引的行锁
  3. 辅助索引的间隙锁
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值