《MySql学习》 MySQL的 加锁规则
MySQL加锁原则
两个原则
- 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间(区间锁和行锁)。
- 原则 2:查找过程中访问到的对象(索引)才会加锁。
两个优化
1.优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁(不会加行锁)。
2.优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁(条件已经不满足,不需要加行锁)。
一个BUG (8.0之前)
唯一索引上的范围查询会访问到不满足条件的第一个值为止。
一.等值查询间隙锁
初始化表与数据
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);
由于表 t 中没有 id=7 的记录,所以用我们上面提到的加锁规则判断一下的话:根据原则 1,加锁单位是 next-key lock,session A 加锁范围就是 (5,10];同时根据优化 2,这是一个等值查询 (id=7),而 id=10 不满足查询条件,next-key lock 退化成间隙锁,因此最终加锁的范围是 (5,10)。所以,session B 要往这个间隙里面插入 id=8 的记录会被锁住,但是 session C 修改 id=10 这行是可以的。
二 .非唯一索引等值锁
首先c是有索引的,根据原则 1,加锁单位是 next-key lock,由于 c 不是唯一索引,需要锁住 (0,5]这个区间,且仅访问 c=5 这一条记录是不能马上停下来的,需要向右遍历,查到 c=10 才放弃。根据原则 2,访问到的都要加锁,因此要给 (5,10]加 next-key lock。但是同时这个符合优化 2:等值判断,向右遍历,最后一个值不满足 c=5 这个等值条件,因此退化成间隙锁 (5,10)。根据原则 2 ,只有访问到的对象才会加锁,这个查询使用覆盖索引,并不需要访问主键索引,所以主键索引上没有加任何锁,这就是为什么 session B 的 update 语句可以执行完成。
三.主键索引范围锁
对于session A 来说,首先需要找到id=10这一列,根据原则一加区间锁与行锁(5,10],由于 id 是主键索引,因此会退化成行锁 只锁住 id=10 这一行数据。然后往后遍历直到找到第一个不满足 > 10 且 < 11的数,也就是15.由于是范围查询并不是等值查询,不满足优化一,二。因此此时是锁区间(10,15)和 id=15这一行数据。最终锁的范围是 [10,15]。
四.非唯一索引范围锁
c 是索引,但不是唯一索引,首先等值查询 c=10,然后再向后找到不满足等值的第一个值,原则一,优化二 锁的范围为 (5,15],优化二 退化为 区间锁 (5,15)。然后范围查询 根据原则一 加锁为 (10,15]。
《MySql学习》 MySQL的 加锁规则相关推荐
- Mysql学习------MySQL运算符
MySQL运算符 MySQL运算符主要包括3大类:比较运算符.算术运算符.逻辑运算符 算术运算符 加+.减-.乘*.除/.求余% mysql> select 1+2; +-----+ | 1+2 ...
- MySQL学习-MySQL数据库事务
MySQL数据库事务 1.事务概述 1.什么是事务? 2.和事务相关的语句只有:**DML语句.(insert delete update)** 3.假设所有的业务都能使用1条DML语句搞定,还需要事 ...
- MySQL学习-MySQL条件查询
MySQL条件查询 操作的表 1.条件查询概述 2.条件查询between and] 3.条件查询is null和is not null 4.and和or的优先级的问题 5.条件查询in 6.模糊查询 ...
- mysql学习--mysql必知必会
上图为数据库操作分类: 以下的操作参考(mysql必知必会) 创建数据库 执行脚本建表: mysql> create database mytest; Query OK, 1 row affec ...
- mysql打不开 10061_mysql 10061报错,mysql 10061解决方法,10061问题,mysql学习,mysql启动
有时候mysql打不开,出现mysql10061问题 树懒君建议你,先检查MySQL 服务是否启动,如果没有启动则启动这个服务即可解决:如果问题还是没有解决请尝试下面的步骤: 首先要关闭MYSQL服务 ...
- mysql limit锁_我所理解的MySQL五:锁及加锁规则
mysql教程栏目介绍MySQL的第五篇文章,关于锁及加锁规则. MySQL 系列的第五篇,主要内容是锁(Lock),包括锁的粒度分类.行锁.间隙锁以及加锁规则等. MySQL 引入锁的目的是为了解决 ...
- mysql 联合主键 加锁_MySQL 加锁处理分析
背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...
- mysql root dengru_Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼)
<Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼)>要点: 本文介绍了Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼),希望对您有用.如果有疑问,可以联系我 ...
- mysql errno 1146_Mysql学习MySQL复制出错 Last_SQL_Errno:1146的解决方法
<MysqL学习MysqL复制出错 Last_sql_Errno:1146的解决方法>要点: 本文介绍了MysqL学习MysqL复制出错 Last_sql_Errno:1146的解决方法, ...
最新文章
- 校园二手平台的开发和利用
- Elasticsearch 7.0中引入的新集群协调子系统如何使用?
- oracle 填入编号,sql – 带填充模式的Oracle to_char格式编号(FM0000)
- WGAN-GP代码注释
- SAP云平台与企业数字型转型
- php post授权编写,php模拟post行为代码总结(POST方式不是绝对安全)
- 前端学习(2192):Promise的all的使用
- 【算法】剑指 Offer 04. 二维数组中的查找 【重刷】
- 支付宝AI大幅提升细粒度图像分类识别精度,一眼看穿万物细微差异
- 200000000021 键盘监听事件
- spring源码:注册后置处理器
- STM32串口通信实例
- 国内的点对点聊天工具鱼信Fishchat怎么用?
- 密码套件 and 弱密码套件漏洞
- GhostExp 2010特别版安装方法
- Linux下添加开机启动,Linux设置程序开机自启动
- 英语写作技巧 ——“李靖“
- java技术选型文档模板_系统方案汇总文档
- 【Week 15 作业】A - ZJM 与霍格沃兹(必做)、B - ZJM 与生日礼物(选做)、C - ZJM 与纸条(选做)
- wine - qq无法显示图片头像