MySQL加锁原则

两个原则

  1. 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间(区间锁和行锁)。
  2. 原则 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的 加锁规则相关推荐

  1. Mysql学习------MySQL运算符

    MySQL运算符 MySQL运算符主要包括3大类:比较运算符.算术运算符.逻辑运算符 算术运算符 加+.减-.乘*.除/.求余% mysql> select 1+2; +-----+ | 1+2 ...

  2. MySQL学习-MySQL数据库事务

    MySQL数据库事务 1.事务概述 1.什么是事务? 2.和事务相关的语句只有:**DML语句.(insert delete update)** 3.假设所有的业务都能使用1条DML语句搞定,还需要事 ...

  3. MySQL学习-MySQL条件查询

    MySQL条件查询 操作的表 1.条件查询概述 2.条件查询between and] 3.条件查询is null和is not null 4.and和or的优先级的问题 5.条件查询in 6.模糊查询 ...

  4. mysql学习--mysql必知必会

    上图为数据库操作分类: 以下的操作参考(mysql必知必会) 创建数据库 执行脚本建表: mysql> create database mytest; Query OK, 1 row affec ...

  5. mysql打不开 10061_mysql 10061报错,mysql 10061解决方法,10061问题,mysql学习,mysql启动

    有时候mysql打不开,出现mysql10061问题 树懒君建议你,先检查MySQL 服务是否启动,如果没有启动则启动这个服务即可解决:如果问题还是没有解决请尝试下面的步骤: 首先要关闭MYSQL服务 ...

  6. mysql limit锁_我所理解的MySQL五:锁及加锁规则

    mysql教程栏目介绍MySQL的第五篇文章,关于锁及加锁规则. MySQL 系列的第五篇,主要内容是锁(Lock),包括锁的粒度分类.行锁.间隙锁以及加锁规则等. MySQL 引入锁的目的是为了解决 ...

  7. mysql 联合主键 加锁_MySQL 加锁处理分析

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

  8. mysql root dengru_Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼)

    <Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼)>要点: 本文介绍了Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼),希望对您有用.如果有疑问,可以联系我 ...

  9. mysql errno 1146_Mysql学习MySQL复制出错 Last_SQL_Errno:1146的解决方法

    <MysqL学习MysqL复制出错 Last_sql_Errno:1146的解决方法>要点: 本文介绍了MysqL学习MysqL复制出错 Last_sql_Errno:1146的解决方法, ...

最新文章

  1. 校园二手平台的开发和利用
  2. Elasticsearch 7.0中引入的新集群协调子系统如何使用?
  3. oracle 填入编号,sql – 带填充模式的Oracle to_char格式编号(FM0000)
  4. WGAN-GP代码注释
  5. SAP云平台与企业数字型转型
  6. php post授权编写,php模拟post行为代码总结(POST方式不是绝对安全)
  7. 前端学习(2192):Promise的all的使用
  8. 【算法】剑指 Offer 04. 二维数组中的查找 【重刷】
  9. 支付宝AI大幅提升细粒度图像分类识别精度,一眼看穿万物细微差异
  10. 200000000021 键盘监听事件
  11. spring源码:注册后置处理器
  12. STM32串口通信实例
  13. 国内的点对点聊天工具鱼信Fishchat怎么用?
  14. 密码套件 and 弱密码套件漏洞
  15. GhostExp 2010特别版安装方法
  16. Linux下添加开机启动,Linux设置程序开机自启动
  17. 英语写作技巧 ——“李靖“
  18. java技术选型文档模板_系统方案汇总文档
  19. 【Week 15 作业】A - ZJM 与霍格沃兹(必做)、B - ZJM 与生日礼物(选做)、C - ZJM 与纸条(选做)
  20. wine - qq无法显示图片头像

热门文章

  1. 一个多神的地方,然而到底有多少神灵呢
  2. 人为什么要长大呢?可又怎能不长大!其实越长大越孤单
  3. C语言字符串复制函数strcpy()的编写与详解
  4. SMR硬盘 Linux 环境下ext4的优化
  5. CSS 实现对号效果
  6. C#正则表达式 解析html+table tr td 内容
  7. Github代码在线阅读神器! 程序员必备
  8. JS 获取url传递参数
  9. 618买什么数码电子产品?2022最受欢迎数码好物合集
  10. PhpStorm 的安装使用以及好用的插件 (保姆级教程)