《MySQL——加锁规则(待补全,有些没看懂)》

catalog

    • 加锁规则
    • 等值查询间隙锁
    • 非唯一索引等值锁
    • 主键索引范围锁
    • 非唯一索引范围锁
    • 唯一索引范围锁 bug
    • 非唯一索引上存在"等值"的例子
    • limit语句加锁
    • 关于死锁

总结

1、查询过程中访问到的对象才会加锁,而加锁的基本单位是next-key lock(前开后闭);
2、等值查询上MySQL的优化:索引上的等值查询,如果是唯一索引,next-key lock会退化为行锁,如果不是唯一索引,需要访问到第一个不满足条件的值,此时next-key lock会退化为间隙锁;
3、范围查询:无论是否是唯一索引,范围查询都需要访问到不满足条件的第一个值为止;

加锁规则

默认这里的隔离级别是可重复读。
原则1:加锁的基本单位是next-key lock。该锁的区间是前开后闭
原则2:查找过程中访问到的对象才会加锁
优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁
优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁
bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。

建表语句:

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);

等值查询间隙锁

在这里插入图片描述

非唯一索引等值锁

在这里插入图片描述

session A给索引c上c=5这一行加上读锁。

根据原则1,加锁单位是next-key lock ,因此会给(0,5]加上next-key lock.

c是普通索引,因此访问c=5后还需要向右遍历,查到c=10才放弃。

根据原则2,访问到的都要加锁,因此要给(5,10]加上next-key lock;

同时符合优化2:等值判断,向右遍历,最后一个值不满足c=5,于是退化为间隙锁(5,10);

(前面分析的(0, 5]间隙锁还是存在的,合起来存在(0, 5]和(5, 10)两个间隙锁 )

根据原则2,只有访问到的对象才会加锁,这个查询使用的是覆盖索引,并不需要访问主键索引,所以主键索引上没有加任何锁,所以session B的update语句可以执行完成。

**访问到的对象才会加锁,这个“对象”指的是列,不是 记录行。 补充一下: 加锁,是加在索引上的。 列上,有索引,就加在索引上; 列上,没有索引,就加在主键上; **

session C要插入(7,7,7)记录,会被session A 的间隙锁(5,10)锁住。

lock in share mode 只锁覆盖索引,for update 会顺便给主键索引上满足条件的行加上行锁。

总结:

锁是加在索引上的;

用lock in share mode 来给行加读锁避免数据被更新的话,就必须绕过覆盖索引的优化,在查询字段中加入索引中不存在的字段。

如将session A的语句:

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

修改为

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

数据行加读锁,如果查询字段使用了覆盖索引,访问到的对象只有普通索引,并没有访问到主键索引,则不会锁主键索引。如果没有使用覆盖索引,且当前查询是for update ,update 和 delete 都是当前读,则会回表查询,访问到主键索引,这样主键索引也会加锁。

主键索引范围锁

对于表t,有两个查询语句,这两个语句加锁范围不同:

select * from t where id = 10 for update;
select * from t where id >= 10 and id < 11 for update;

这两句话逻辑上等价,但是加锁规则不一样。
在这里插入图片描述
执行流程:

1、找到第一个id=10的行,因此本该是next-key lock (5,10]。根据优化1,主键id上的等值条件,退化成行锁,只加id = 10这一行的行锁

2、范围查找继续往后找,找到id=15这一行停下来,因此需要加next-key lock (10,15].

所以,session A这时候锁的范围就是主键索引上,行锁id = 10和next-key lock(10,15]。 因为是范围查询,不是等值查询,所以不会进行优化2; 所以会出现B C的block情况。

需要注意 首次session A 定位查找id=10的行时候,是当作等值查询来判断的,而向右扫描到id=15的时候,用的是范围查询判断。

--引用:
1. 先走主键id索引, 拿出id=10的那一行, (注意这里是等值查询) 2. 再从id=10的那一行开始, 不断地往右遍历拿出每一行, 直到它的 id 不满足 大于等于10, 小于11 这个条件后, 再停止 (注意这里就是范围查询) 根据一开始的Creae table/ insert values等语句(10后面就是15), 还有再根据加锁规则(原则1, 原则2, 优化1, 优化2, bug5): 执行步骤1, 因为是等值查询, 主键索引又是唯一索引, 根据原则1, 原则2, 优化1, 最终只加行锁10; 执行步骤2, 因为是范围查询, 主键索引又是唯一索引, 根据原则1, 原则2, Bug5, 而不满足条件的第一个值就是15, 所以最终要加锁(10, 15]; 这一块相对还是比较繁琐的

非唯一索引范围锁

在这里插入图片描述

唯一索引范围锁 bug

在这里插入图片描述

非唯一索引上存在"等值"的例子

给表t插入一条新纪录

insert into t values(30,10,30);

此时表里面就有了两个c=10的行。 因为主键是唯一的, 所以不存在完全相同的两行 ,此时的索引c为:
在这里插入图片描述
两个c=10,但是主键id不同(分别为10和30),因此这两个c=10的记录之间也是有间隙的。
这里使用delete语句来验证。delete原则和之前update原则一样。
在这里插入图片描述
session A遍历的时候,先访问第一个c=10的记录。根据原则1:这里加的是

(c = 5,id = 5) 到(c = 10,id = 10)这个next-key lock.

然后,session A向右查找,直到碰到(c=15,id=15)这一行,循环才结束。根据优化2,这是一个等值查询,向右查找到了不满足条件的行,所以会退化成(c=10,id=10)到(c=15,id=15)的间隙锁。

也就是说,这个delete语句在索引c上的加锁范围,如下:
在这里插入图片描述
注意(c=5,id=5)和(c=15,id=15)这两行都没有锁。

limit语句加锁

在这里插入图片描述

关于死锁

next-key lock实际上是间隙锁和行锁加起来的结果。

在这里插入图片描述
分析流程:

1、session A启动事务执行查询语句加lock in share mode,在索引c上加了next-key lock(5,10]和间隙锁(10,15);

2、session B的update语句在索引c上加next-key lock(5,10],进入锁等待;

3、然后session A要再插入(8,8,8)这一行,被session B的间隙锁锁住。由于出现了死锁,InnoDB让session B回滚。

我们认为session B的加锁还没申请成功。

但是,其实session B的"加next-key lock(5,10]"操作实际上分成了两步,先是加(5,10)的间隙锁,加锁成功;然后加c=10的行锁,第二步才被锁住。

也就是说我们分析加锁的具体步骤时,需要分成间隙锁和行锁两段来执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 命名空间命名规范_C#中的命名空间

c# 命名空间命名规范C&#xff03;命名空间 (C# Namespace ) In C# namespaces are used to group similar type of classes. Two classes with same name in different namespaces never conflict to each other. 在C&#xff03;中&#xff0c;名称空间用于对相似类型的类进…

PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程

这两天刚装好Windows 7&#xff0c;碰巧前段时间有朋友问我Windows下如何安装搭建PHP环境&#xff0c;所以打算勤劳下&#xff0c;手动一步步搭建PHP环境&#xff0c;暂且不使用PHP环境搭建软件了&#xff0c;在此详细图解在Windows 7下安装配置PHPApacheMysql环境的教程&#…

《MySQL—— 业务高峰期的性能问题的紧急处理的手段 》

catalog短连接风暴先处理占着连接但是不工作地线程减少连接过程的消耗慢查询性能问题索引没有设计好语句没写好选错索引QPS突增问题短连接风暴 正常的短连接&#xff1a; 执行很少sql语句就断开&#xff0c;下次需要的时候再重连。MySQL建立连接的过程成本很高&#xff0c;包含…

sql 算出下级销售总和_找出总和字符串

sql 算出下级销售总和Description: 描述&#xff1a; This is a standard interview problem to check that the given string is a sum string or not using backtracking. 这是一个标准的面试问题&#xff0c;用于检查给定的字符串是否为总和字符串或不使用回溯。 Problem…

Request 分别获取具有相同 name 属性表单元素值

html 中是允许多个具有相同name属性的元素的&#xff0c;例如 <div> <input name"txtName" id"txtFirstName" type"text" /> <input name"txtName" id"txtMiddleName" type"text" /> <input…

《MySQL——redo log 与 binlog 写入机制》

目录binlog写入机制redo log写入机制组提交机制实现大量的TPS理解WAL机制如何提升IO性能瓶颈WAL机制告诉我们&#xff1a;只要redo log与binlog保证持久化到磁盘里&#xff0c;就能确保MySQL异常重启后&#xff0c;数据可以恢复。 下面主要记录一下MySQL写入binlog和redo log的…

BBIAB的完整形式是什么?

BBIAB&#xff1a;再回来一点 (BBIAB: Be Back In A Bit) BBIAB is an abbreviation of "Be Back In A Bit". BBIAB是“ Be Back in A Bit”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites lik…

字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

涉及到字符串的问题&#xff0c;无外乎这样一些算法和数据结构&#xff1a;自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法&#xff0c;而这里面最常用和最熟悉的大概是kmp&#xff0c;即使如此还是有相当一部分人也…

WPF CanExecuteChanged

继承ICommand ,RelayCommand命令 1 public class RelayCommand : ICommand2 {3 private readonly Action _execute;4 private readonly Func<bool> _canExecute;5 public event EventHandler CanExecuteChanged;6 public RelayComma…

《MySQL——主备一致性六问六答》

目录备库为什么要设置为只读模式&#xff1f;备库设置为只读&#xff0c;如何与主库保持同步更新&#xff1f;A到B的内部流程如何&#xff1f;binlog内容是什么&#xff1f;row格式对于恢复数据有何好处M-M结构的循环复制问题以及解决方案备库为什么要设置为只读模式&#xff1…

代码管理工具

http://blogs.msdn.com/b/visualstudio/archive/2012/06/11/world-of-samples-at-your-fingertips.aspx转载于:https://www.cnblogs.com/hebeiDGL/archive/2012/09/25/2700961.html

fyi 在邮件里是什么意思_FYI的完整形式是什么?

fyi 在邮件里是什么意思仅供参考&#xff1a;供您参考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替换 vmwp

要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见&#xff1a;http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下载后腰替换 先把 Hyper-V 的俩服务停止掉 然后找到 C:\Windows\System32\vmwp.exe 右键--安全 替换掉所有者 然后给自己…

《MySQL——主备切换流程与主备延迟》

目录主备切换主备延迟的原因可靠性优先策略的主备切换流程可用性优先策略的主备切换流程主备切换 主备切换分为主动运维与被动操作。 软件升级、主库所在机器按计划下线为主动运维。 主库所在机器掉电为被动操作。 同步延迟 1、主库A执行完一个事务&#xff0c;写入binlog…

ejb模式_EJB的完整形式是什么?

ejb模式EJB&#xff1a;企业Java Bean (EJB: Enterprise Java Bean) EJB is an abbreviation of Enterprise Java Bean. EJB is one of many Java application programming interfaces (API) for flexible and manageable structuring of Java Platform, Enterprise Edition (J…

Android之PreferenceActivity

http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多书中都没有对PreferenceActivity做介绍&#xff0c;而我正好又在项目中用到&#xff0c;所以就把自己的使用的在这总结一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下…

浅谈算法和数据结构: 七 二叉查找树

前文介绍了符号表的两种实现&#xff0c;无序链表和有序数组&#xff0c;无序链表在插入的时候具有较高的灵活性&#xff0c;而有序数组在查找时具有较高的效率&#xff0c;本文介绍的二叉查找树(Binary Search Tree&#xff0c;BST)这一数据结构综合了以上两种数据结构的优点。…

scala部分应用函数_Scala中的部分函数

scala部分应用函数Scala部分功能 (Scala partial functions) A partial function is a function that returns values only for a specific set of values i.e. this function is not able to return values for some input values. This function is defined so that only som…

《MySQL——备库多线程复制策略。》

目录备库并行复制能力MySQL5.6版本 并行复制策略MariaDB 并行复制策略MySQL5.7版本 并行复制策略MySQL5.7.22版本 并行复制策略总结备库并行复制能力 主要涉及两个方面的并行度&#xff1a; 1、客户端写入主库的能力 2、备库上sql_thread执行中转日志relay log 1的并行能力…

人脸是门大生意

我们正处在一个新时代的入口。人有70%的能量是被大脑消耗&#xff0c;大脑90%的能量用来处理视觉信息&#xff0c;人脸则承载了绝大部分的视觉信息。我们要讨论的是一个比Google Glass更酷的世界。文/程苓峰-云科技网易邮箱的用户已经可以用人脸而不是密码来验证登陆。安卓4.0实…