加锁规则

  1. 加锁的基本单位是next-key lock,是前开后闭区间。
  2. 查找过程中访问到的对象才会被加锁。
  3. 索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁
  4. 索引上的等值查询,向右遍历时且最后一个值不符合等值条件的时候,next-key lock退化为间隙锁
  5. 唯一索引的范围查询会访问到不满足条件的第一个值为止。

建表语句:

create table `t` (
`id` int(11) not NULL,
`c` int(11) default NULL,
`d` int(11) default NULL,
primary key (`id`),
key `c` (`c`) ) ENGINE = InnoDB;

初始化数据:

insert into t values(0,0,0),(5,5,5), (10,10,10),(15,15,15),(20,20,20),(25,25,25);

唯一索引等值查询间隙锁

sessionA加锁分析:
加上next-key lock锁,锁的是(5,10];
虽然是给唯一索引加锁,但是因为id=7不存在,所以不会退化为行锁;
依据原则4,索引上的等值查询,向右遍历直到最后一个不满足条件的时候退化为间隙锁,所以id的锁范围变为(5,10)
sessionB被锁住,sessionC因为id=10不在区间内,所以不会被锁住

非唯一索引等值查询间隙锁

分析一下sessionA的加锁:
sessionA给c=5这一行加上读锁,next-key lock给索引c加锁范围是(5,10],不是唯一索引所以不会退化为行锁,等值查询最后一个值不满足条件,退化为间隙锁,索引c的next-key lock锁范围变为(5,10),但是因为select中的字段是id,所以是覆盖索引,不会访问到主键,因此不会对主键的[5,10)加上锁;sessionB中id=5可以正常执行,sessionC中的字段c在区间中,所以阻塞。

需要注意,在这个例子中,lock in share mode只锁覆盖索引,但是如果是for update就不一样 了。 执行 for update时,系统会认为你接下来要更新数据,因此会顺便给主键索引上满足条件的行加上行锁。

如果要在lock in share mode 的基础上防止通过id更新数据的话,可以在select字段中加上一个没有索引的字段,这样就不会用到覆盖索引了。

唯一索引范围查询

sessionA中找到第一个id=10的行,原本应该是(5,10],因为这个时候还是走的id=10等值查询,所以根据原则3,因为id是唯一索引,所以退化为行锁,也就给id=10加了行锁;
开始走范围查询,依据原则5,继续找下一个不满足条件的值,(初始化数据)在数据库中【第一个】不满足条件的值就是(15,15,15);
所以next-key lock给id加的锁范围是(10,15]。
sessionB中插入的(8,8,8)不在区间内,可以执行;但是(13,13,13)在区间内,执行被阻塞;sessionC中id=15是在区间内的,被阻塞;

但是我实际操作的时候发现sessionC的sql是可以执行的,有点费解。不知道是不是版本原因。

非唯一索引范围查询

这次session A用字段c来判断,加锁规则跟案例三唯一的不同是:在第一次用c=10定位记录的时 候,索引c上加了(5,10]这个next-key lock后,由于索引c是非唯一索引,没有优化规则,也就是 说不会蜕变为行锁,因此最终sesion A加的锁是,索引c上的(5,10] 和(10,15] 这两个next-key lock。

上面是直接复制的,因为不太理解其中说的 “在第一次用c=10定位记录的时 候,索引c上加了(5,10]”,为啥加的是(5,10]不是(10,15];
而且(10,15]这个区间也没能理解,c >10和c < 11就应该是(10,15)。 这个地方也给困住了。

唯一索引范围锁

sessionA中先给id=15等值查询加锁,再退化为行锁;再做范围查询锁,next-key lock给id加锁范围应该是(10,15},再依据原则5,唯一索引范围查询会一直访问到第一个不满条件的值,也就是id=20;所以实际加的锁范围是(10,20]。

但是我实际操作的时候发现,sessionB并不会阻塞,而且sessionC也没有被阻塞,我试了下给id=15做更新,再想插入(14,14,14),或者插入(11,11,11),都被阻塞了,更新 id=10是可以的所以实际锁的范围是(10,15]。

读mysql45讲-netx-key lock相关相关推荐

  1. 极客mysql45讲学习总结

    文章目录 1 mysql基础知识 1.1 基础架构 1.1.1 连接器 1.1.2 查询缓存 1.1.3 分析器 1.1.4 优化器 1.1.5 执行器 1.2 日志系统 1.2.1 redo log ...

  2. 来,锁个痛快(6)—— 与lock相关的视图和简单实验

    上篇算是对lock做了一个概述,相信大家对lock也有了一定的了解,但是锁的冲突自然是不希望被看到的,那通过动态视图我们可以更加详尽地了解当前lock的情况并且进行处理,如何及时地判断锁定的情况以及及 ...

  3. 阿龙的学习笔记---MySQL45讲的总结(一)

    学习这个大佬的课,的确超级有经验:https://time.geekbang.org/column/intro/100020801 查询语句过程 连接器,分析器,优化器,执行器,最后到存储引擎. My ...

  4. mysql45讲--09-44实践篇总结

    09讲普通索引和唯一索引,应该怎么选择 查询过程 执行查询语句 select id from T where k=5 普通索引:查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,直到碰到 ...

  5. 【极客时间】《MySQL45讲》学习笔记

    内容来源:开篇词 | 这一次,让我们一起来搞懂MySQL-极客时间 以下是来自网友对课程的知识点的分类总结: 本章内容[本章内容建议阅读时长] 编号|建议阅读时长|文章标题 1. 基础知识[12'] ...

  6. mysql45讲学习笔记

    写个博客记录我的学习过程,我也会相对容易坚持下去,不至于半途而废 强烈建议自己去看这个课,我这里只记录知识点,方便自己回顾和复习,看我这不行的,人家的都有例子和引导,让你理解知识点变得容易且印象深刻, ...

  7. MySQL45讲学习笔记(1)

    文章目录 SQL的执行 一条查询语句的执行过程 一条SQL更新语句是如何执行的? InnoDB特有的日志:Redo Log 重要日志模块: BinLog InnoDB更新语句的执行流程 两阶段提交 事 ...

  8. MySQL实战45讲--日志和索引相关问题(15)

    到目前为止,已经收集了 47 个问题,很难通过今天这一篇文章全部展开.所以,我就先从中找了几个联系非常紧密的问题,串了起来,希望可以帮你解决关于日志和索引的一些疑惑.而其他问题,我们就留着后面慢慢展开 ...

  9. MySQL45讲(第11-15讲)

    目录 怎么给字符串字段加索引 前缀索引对覆盖索引的影响 其他方式 为什么我的MySQL会"抖"一下(redo与fsysnc) 什么情况会引发数据库的flush过程呢? 上面四种场景 ...

最新文章

  1. 逻辑结构图向关系转换规则
  2. Windows 之 win10快捷键
  3. PHP入门指导:如何学习PHP?
  4. flex布局知识点总结
  5. pytorch之tensor按索引赋值,三种方法!
  6. 智能窗帘研究制作_基于51单片机智能窗帘的研究与设计
  7. tomcat项目的ajax路径问题,Tomcat下ajax请求路径总结
  8. 从串行线程封闭到对象池、线程池
  9. Java经典设计模式:五大创建型模式
  10. Microsoft Office Communications Server 2007 R2 RTM 简体中文企业版部署速成篇之一
  11. 点云算法在条码识别任务中的应用
  12. 计算机开启网络共享,一键开启共享_局域网win7访问xp_打开默认共享命令
  13. 9 matlab入门求一元二元函数的最小值和零点
  14. 30 个 Python 编程实用技巧
  15. 台式计算机如何拆硬盘,台式机硬盘如何拆卸
  16. iOS端播放VR图片
  17. Unity Shader - GrabPass 实现武器热扭曲拖尾效果
  18. mybatis数组越界异常 Error preparing statement
  19. spin_lock、spin_lock_bh、spin_lock_irq、spin_lock_irqsave的使用
  20. 2019关于闪存芯片NAND FLASH的封装介绍

热门文章

  1. 如何巧妙的表达离职原因
  2. 01网络协议:从TCP协议到RPC协议都经历了哪些?
  3. 重磅!国家最高科学技术奖刚刚揭晓,刘永坦和钱七虎院士获奖...
  4. ArcSDE10.2 连接PostSql9.2的安装与配置(含10.2全套下载链接)
  5. [Luogu2901][USACO08MAR]牛慢跑Cow Jogging Astar K短路
  6. html单词和单词之间的距离,如何给HTML页面的文本设置字符和单词间距
  7. 第1篇 编程能力是什么
  8. python语音控制电脑程序_用Python编程实现语音控制电脑_天津SEO
  9. git - git blame用法
  10. python用tkinter实现qq_Python+Tkinter 密保小工具-阿里云开发者社区