什么是next-key lock?

在RR(可重复读,mysql默认事务隔离级别)隔离级别下,mysql 通过next-key lock解决了大部分幻读的场景。

next-key lock 由行锁和间隙锁组成。

比如(5, 10) 和 加在10上的行锁组成(5,10]的next-key lock

怎么加next-key lock?

  1. 加锁的基本单位是next-key lock, 前开后闭区间;
  2. 查找过程访问的对象才会加锁
  3. 优化1:索引上的等值查询,唯一索引加锁会退化为行锁
  4. 优化2:索引上的等值查询,向右遍历且最后一个值不满足等值条件时候,next-key lock

    退化为间隙锁
  5. mysql 5.xxx <= 5.7.24 和 8.0系列 <= 8.0.13 的 版本,当给唯一索引加锁时,会

    访问到不满足条件的第一个值为止。

等值查询:指的是搜索索引树的过程。

例子

select * from t where id > 9 and id < 12 order by id desc for update;

加锁 (0, 5], (5, 10], (10, 15)

加锁过程: 第一个满足条件的是id=10,加next-key lock (5, 10],

id=10是索引树上存在的记录,继续往右侧查询,根据优化2,加间隙锁(10, 15)。

根据order by id desc,然后往左遍历,遇到5, 加next-key lock

(0, 5], 因为5已经不满足id < 9条件了,停止遍历

select * from t where id > 9 and id < 12 order by id for update;

加锁 (5, 10], (10 15]

加锁过程:跟上面一样,第一个满足条件的是id=10,加next-key lock (5, 10],

往右遍历,遇到15,加next-key lock (10, 15), 不满足id < 12条件了,停止遍历。

select * from t where c > 5 lock in share

加锁:(5,10]、(10,15]、(15,20]、(20,25]和 (25,supremum]

加锁过程:从索引树上遍历,第一个遇到10,加(5, 10], 然后,15,20,25。最后的25加的是

(25, supremum], supremum 代表正无穷。

lock in share mode 对比 for update

select id from t where c=5 lock in share mode;

加锁:(0, 5], (5, 10)

加锁过程:在索引树上找到c=5,加next-key lock (0,5], 由于不是c不是唯一索引,还需要继续往右

查找,找到10,加next-key lock (5,10],根据优化2,10不满足等值条件,退化为(5,10)。因此查询刚好被索引覆盖了,主键不用锁上,

因此主键索引5是可以更新的,但是for update就会顺便把主键也锁上

# 什么是next-key lock?的更多相关文章

  1. Key lock 的秘密

    研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了: Exec sp_lock:   就说上面的key ...

  2. 关于InnoDB的Next-Key lock

    最近一段时间在准备新员工培训的材料,本来打算介绍介绍概念就OK的,但是既然写了事务的章节,就特别想介绍一下锁,介绍了锁,就忍不住想介绍一下Next-Key Lock. 大家知道,标准的事务隔离级别有R ...

  3. How to make remote key fob for 2002 BMW 3 series

    Here share with you on how to make remote key fob for 2002 BMW 3 series: Method 1: 1. Working within ...

  4. C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)

    本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...

  5. [MySQL] gap lock/next-key lock浅析

    当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将锁细分为如下几种子类型: record lock (RK) 记录锁, 仅仅锁住索引记录的一行 ...

  6. gap lock/next-key lock浅析 Basic-Paxos协议日志同步应用

    http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...

  7. gap lock/next-key lock浅析Basic-Paxos协议日志同步应用

    http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...

  8. 1.Redis Lock

    使用场景 同步锁,让业务方法在锁设定的时间内是同步执行的 redisService.setIfAbsent redisService.expire @PostMapping("/update ...

  9. 增强版字典DictionaryEx

    代码 public class DictionaryEx<TKey, TValue> : IDictionary<TKey, TValue> { /// <summary ...

  10. [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计

    目       录 第十三章     中英文版本切换设计... 2 13.1        不用自带的资源文件的理由... 2 13.2        配置文件... 2 13.3        语言 ...

随机推荐

  1. 一个工具管理你的所有 SDK 版本!

    众所周知,我们在面对同一个 SDK 的不同版本时,需要使用到不同的工具来管理,例如: Java:JEnv NodeJs:nvm ... 它们的原理都是基于系统的软连接,让环境变量指向一个软连接来实现切 ...

  2. 混合von-misse分布

    以下是混合 von Mises 分布的 C 语言实现,包含数据生成和 EM 算法参数估计.代码实现了核心数学逻辑,并附有详细注释. 1. 核心代码实现 (1) 头文件与宏定义 (mix_vonmise ...

  3. nsw与mock 模拟分页接口

    安装依赖 项目中使用到一下依赖,请提前安装 npm install msw lodash axios 开启mock 定义mock,创建 src/mock/index.ts import _ from ...

  4. Luogu P11158 【MX-X6-T4】夢重力 题解

    P11158 [MX-X6-T4]夢重力 分类讨论好题. 不难发现交换行等价于交换列,考虑转化贡献体,枚举长度为 \(\frac{n}{2}\) 区间,统计这个区间被多少种交换方式包含. 考虑一个长度 ...

  5. CF1956C Nene's Magical Matrix 题解

    CF1956C Nene's Magical Matrix 被这题送走了,纪念一下. 巧妙的构造题,考虑比较方便处理的方案,假设我们从左上角的顶点开始涂,每次涂一个 \(1,2,3\dots n\) ...

  6. ViewModelProviders报错

    //创建ViewModel实例 //MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class); //该方法已弃用 M ...

  7. API智能识别平台,业务逻辑智能识别

    通过API智能识别平台,可以把企业所有业务系统的应用接口能力进行自动识别,并创建为标准化的Restful API,然后再进行集成. 在企业系统集成的过程中,可能需要面对多种类型的集成接口以及专有业务系 ...

  8. 通过ETL工具快速实现单据同步

    ETLCloud介绍 ETLCloud是一款旨在解决企业数据集成挑战的最新一代平台,它集成了离线数据集成ETL.ELT.CDC实时数据集成.编排调度和数据服务API等功能,形成了一体化的DataOps ...

  9. MySQL报'Access denied for user 'root'@'localhost' (using password: NO)'错误的解决--九五小庞

    当在命令提示符下执行该命令时,报下列错误 [root@clvn]# mysqladmin -u root password "sorry"mysqladmin: connect t ...

  10. AI大模型时代已来,推荐几款主流的智能化低代码平台(附真实测评)

    ​ 随着AI大模型技术深入应用于企业管理应用的各方面,目前作为企业数字化应用构建的有力工具--低代码平台,也正迎来AI智能化升级.现在,市场上的各种低代码平台通过集成AI技术.自动化流程与数据分析等能 ...