# 什么是next-key lock?
什么是next-key lock?
在RR(可重复读,mysql默认事务隔离级别)隔离级别下,mysql 通过next-key lock解决了大部分幻读的场景。
next-key lock 由行锁和间隙锁组成。
比如(5, 10) 和 加在10上的行锁组成(5,10]的next-key lock
怎么加next-key lock?
- 加锁的基本单位是next-key lock, 前开后闭区间;
- 查找过程访问的对象才会加锁
- 优化1:索引上的等值查询,唯一索引加锁会退化为行锁
- 优化2:索引上的等值查询,向右遍历且最后一个值不满足等值条件时候,next-key lock
退化为间隙锁 - 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?的更多相关文章
- Key lock 的秘密
研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了: Exec sp_lock: 就说上面的key ...
- 关于InnoDB的Next-Key lock
最近一段时间在准备新员工培训的材料,本来打算介绍介绍概念就OK的,但是既然写了事务的章节,就特别想介绍一下锁,介绍了锁,就忍不住想介绍一下Next-Key Lock. 大家知道,标准的事务隔离级别有R ...
- 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 ...
- C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)
本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...
- [MySQL] gap lock/next-key lock浅析
当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将锁细分为如下几种子类型: record lock (RK) 记录锁, 仅仅锁住索引记录的一行 ...
- gap lock/next-key lock浅析 Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- gap lock/next-key lock浅析Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- 1.Redis Lock
使用场景 同步锁,让业务方法在锁设定的时间内是同步执行的 redisService.setIfAbsent redisService.expire @PostMapping("/update ...
- 增强版字典DictionaryEx
代码 public class DictionaryEx<TKey, TValue> : IDictionary<TKey, TValue> { /// <summary ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计
目 录 第十三章 中英文版本切换设计... 2 13.1 不用自带的资源文件的理由... 2 13.2 配置文件... 2 13.3 语言 ...
随机推荐
- 一个工具管理你的所有 SDK 版本!
众所周知,我们在面对同一个 SDK 的不同版本时,需要使用到不同的工具来管理,例如: Java:JEnv NodeJs:nvm ... 它们的原理都是基于系统的软连接,让环境变量指向一个软连接来实现切 ...
- 混合von-misse分布
以下是混合 von Mises 分布的 C 语言实现,包含数据生成和 EM 算法参数估计.代码实现了核心数学逻辑,并附有详细注释. 1. 核心代码实现 (1) 头文件与宏定义 (mix_vonmise ...
- nsw与mock 模拟分页接口
安装依赖 项目中使用到一下依赖,请提前安装 npm install msw lodash axios 开启mock 定义mock,创建 src/mock/index.ts import _ from ...
- Luogu P11158 【MX-X6-T4】夢重力 题解
P11158 [MX-X6-T4]夢重力 分类讨论好题. 不难发现交换行等价于交换列,考虑转化贡献体,枚举长度为 \(\frac{n}{2}\) 区间,统计这个区间被多少种交换方式包含. 考虑一个长度 ...
- CF1956C Nene's Magical Matrix 题解
CF1956C Nene's Magical Matrix 被这题送走了,纪念一下. 巧妙的构造题,考虑比较方便处理的方案,假设我们从左上角的顶点开始涂,每次涂一个 \(1,2,3\dots n\) ...
- ViewModelProviders报错
//创建ViewModel实例 //MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class); //该方法已弃用 M ...
- API智能识别平台,业务逻辑智能识别
通过API智能识别平台,可以把企业所有业务系统的应用接口能力进行自动识别,并创建为标准化的Restful API,然后再进行集成. 在企业系统集成的过程中,可能需要面对多种类型的集成接口以及专有业务系 ...
- 通过ETL工具快速实现单据同步
ETLCloud介绍 ETLCloud是一款旨在解决企业数据集成挑战的最新一代平台,它集成了离线数据集成ETL.ELT.CDC实时数据集成.编排调度和数据服务API等功能,形成了一体化的DataOps ...
- MySQL报'Access denied for user 'root'@'localhost' (using password: NO)'错误的解决--九五小庞
当在命令提示符下执行该命令时,报下列错误 [root@clvn]# mysqladmin -u root password "sorry"mysqladmin: connect t ...
- AI大模型时代已来,推荐几款主流的智能化低代码平台(附真实测评)
随着AI大模型技术深入应用于企业管理应用的各方面,目前作为企业数字化应用构建的有力工具--低代码平台,也正迎来AI智能化升级.现在,市场上的各种低代码平台通过集成AI技术.自动化流程与数据分析等能 ...