当前位置:首页 > 生活百科

mysql行锁实现原理(mysql死锁的原因和处理方法)

栏目:生活百科日期:2025-01-30浏览:0

在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁,其中行级锁只提了概念,并没有具体说。

因为行级锁加锁规则比较复杂,不同的场景,加锁的形式还不同,所以这次就来好好介绍下行级锁。

对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间

但是,next-key lock 在一些场景下会退化成记录锁或间隙锁。

那到底是什么场景呢?今天,我们就以下面这个表来进行实验说明。

其中,id 是主键索引(唯一索引),b 是普通索引(非唯一索引),a 是普通的列。

注意,我的 MySQL 的版本是 8.0.26,不同版本的加锁规则可能是不同的

唯一索引等值查询

当我们用唯一索引进行等值查询的时候,查询的记录存不存在,加锁的规则也会不同:

当查询的记录是存在的,在用「唯一索引进行等值查询」时,next-key lock 会退化成「记录锁」当查询的记录是不存在的,在用「唯一索引进行等值查询」时,next-key lock 会退化成「间隙锁」

接下里用两个案例来说明。

先看看记录是存在的。

来看下面这个例子:

会话1加锁变化过程如下:

加锁的基本单位是 next-key lock,因此会话1的加锁范围是(8, 16];但是由于是用唯一索引进行等值查询,且查询的记录存在,所以 next-key lock 退化成记录锁,因此最终加锁的范围是 id = 16 这一行

所以,会话 2 在修改 id=16 的记录时会被锁住,而会话 3 插入 id=9 的记录可以被正常执行。

接下来,看看记录不存在的情况

来看看,下面这个例子:

会话1加锁变化过程如下:

加锁的基本单位是 next-key lock,因此主键索引 id 的加锁范围是(8, 16];但是由于查询记录不存在,next-key lock 退化成间隙锁,因此最终加锁的范围是 (8,16)。

所以,会话 2 要往这个间隙里面插入 id=9 的记录会被锁住,但是会话 3 修改 id =16 是可以正常执行的,因为 id = 16 这条记录并没有加锁。

唯一索引范围查询

范围查询和等值查询的加锁规则是不同的。

举个例子,下面这两条查询语句,查询的结果虽然是一样的,但是加锁的范围是不一样的。

select * from t_test where id=8 for update;select * from t_test where id&>=8 and id&<9 for update;

做个实验就知道了。

会话 1 加锁变化过程如下:

最开始要找的第一行是 id = 8,因此 next-key lock(4,8],但是由于 id 是唯一索引,且该记录是存在的,因此会退化成记录锁,也就是只会对 id = 8 这一行加锁;由于是范围查找,就会继续往后找存在的记录,也就是会找到 id = 16 这一行停下来,然后加 next-key lock (8, 16],但由于 id = 16 不满足 id &< 9,所以会退化成间隙锁,加锁范围变为 (8, 16)。

所以,会话 1 这时候主键索引的锁是记录锁 id=8 和间隙锁(8, 16)。

会话 2 由于往间隙锁里插入了 id = 9 的记录,所以会被锁住了,而 id = 8 是被加锁的,因此会话 3 的语句也会被阻塞。

由于 id = 16 并没有加锁,所以会话 4 是可以正常被执行。

非唯一索引等值查询

当我们用非唯一索引进行等值查询的时候,查询的记录存不存在,加锁的规则也会不同:

当查询的记录存在时,除了会加 next-key lock 外,还额外加间隙锁,也就是会加两把锁当查询的记录不存在时,只会加 next-key lock,然后会退化为间隙锁,也就是只会加一把锁。

接下里用两个案例来说明。

我们先来看看查询的值存在的情况。

比如下面这个例子:

会话 1 加锁变化过程如下:

先会对普通索引 b 加上 next-key lock,范围是(4,8];然后因为是非唯一索引,且查询的记录是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是(8,16)。

所以,会话1的普通索引 b 上共有两个锁,分别是 next-key lock (4,8] 和间隙锁 (8,16) 。

那么,当会话 2 往间隙锁里插入 id = 9 的记录就会被锁住,而会话 3 和会话 4 是因为更改了 next-key lock 范围里的记录而被锁住的。

然后因为 b = 16 这条记录没有加锁,所以会话 5 是可以正常执行的。

接下来,我们看看查询的值不存在的情况

直接看案例:

会话 1 加锁变化过程如下:

先会对普通索引 b 加上 next-key lock,范围是(8,16];但是由于查询的记录是不存在的,所以不会再额外加个间隙锁,但是 next-key lock 会退化为间隙锁,最终加锁范围是 (8,16)。

会话 2 因为往间隙锁里插入了 b = 9 的记录,所以会被锁住,而 b = 16 是没有被加锁的,因此会话 3 的语句可以正常执行。

非唯一索引范围查询

非唯一索引和主键索引的范围查询的加锁也有所不同,不同之处在于普通索引范围查询,next-key lock 不会退化为间隙锁和记录锁

来看下面这个案例:

会话 1 加锁变化过程如下:

最开始要找的第一行是 b = 8,因此 next-key lock(4,8],但是由于 b 不是唯一索引,并不会退化成记录锁。但是由于是范围查找,就会继续往后找存在的记录,也就是会找到 b = 16 这一行停下来,然后加 next-key lock (8, 16],因为是普通索引查询,所以并不会退化成间隙锁。

所以,会话 1 的普通索引 b 有两个 next-key lock,分别是 (4,8] 和(8, 16]。这样,你就明白为什么会话 2 、会话 3 、会话 4 的语句都会被锁住了。

总结

这次我以 MySQL 8.0.26 版本做了几个实验,让大家了解了唯一索引和非唯一索引的行级锁的加锁规则。

这里需要注意的是,不同的版本加锁规则可能会有所不同。我这里总结下, 我这个 MySQL 版本的行级锁的加锁规则。

唯一索引等值查询:

当查询的记录是存在的,next-key lock 会退化成「记录锁」。当查询的记录是不存在的,next-key lock 会退化成「间隙锁」。

非唯一索引等值查询:

当查询的记录存在时,除了会加 next-key lock 外,还额外加间隙锁,也就是会加两把锁。当查询的记录不存在时,只会加 next-key lock,然后会退化为间隙锁,也就是只会加一把锁。

非唯一索引和主键索引的范围查询的加锁规则不同之处在于:

唯一索引在满足一些条件的时候,next-key lock 退化为间隙锁和记录锁。非唯一索引范围查询,next-key lock 不会退化为间隙锁和记录锁。

这些加锁规则其实是很好总结的,大家自己可以用我文中的案例测试一遍,看一下你的 MySQL 版本和我的 MySQL 版本的加锁规则有什么不同。

“mysql行锁实现原理(mysql死锁的原因和处理方法)” 的相关文章

mac投屏到电视怎么设置(苹果手机电视投屏方法)

之前,我们介绍了如何投射手机以观看电视。实际上,使用计算机投射屏幕非常方便。它也是有线和无线的。电缆的连接不需要太多的介绍,根据计算机,电视接口选择合适的连接线...

上海一幼儿园为家长上性教育课(对此你怎么看?)

近日,上海市妇联通过在幼儿园开展面向家长的公益讲座的形式普及性教育。性教育专家陈静为幼儿园小朋友家长开展公益讲座“0-6岁性教育第一课:我从哪里来”。陈静指出,...

小县城创业项目有哪些,50个最抢手的创业项目介绍

目前,在我国大约有2861个县级行政单位和44821个乡级行政单位。在这些县乡中,存在着我国大部分的创业者。县乡没有大城市的繁华,也没有像大城市那么多的创业机遇...

cad技术要求怎么设置(分享CAD编辑器使用技巧)

很多人都知道怎么样在CAD编辑器中插入表格,Word文档等,今天小编将告诉大家如何在CAD编辑器中插入一个程序包。在CAD软件中,可以进行很多的外部文件的插入;...

个人去香港旅游需要什么证件(香港旅游证件办理和必备手

香港电影、TVB电视、港台歌曲对我们的影响实在太大。九龙、旺角、尖沙咀、铜锣湾等地名早已了然于心;充满地道香港风味的大排档、茶餐厅、粥面店、烧腊店、甜品店,让我...

图层锁定了怎么解开(图层锁定的方法)

Photoshop是我们常常用到的修图软件,在图层面板中我们会看到有一个锁定的字样,很多人不知道这个功能是有什么作用的。今天小编就来给大家分享一下ps锁定图层快...

word如何批量删除批注(word每次打开都是修订模式)

作为一名可割可弃的韭菜,哦不,文字编辑,日常工作中总是需要对文档进行各种各样的审阅和修订。可最开始的自己菜得连批注都做不好,为此没少挨领导的批评。这里为大家总结...

mac投屏到小米电视很卡(小米电视投屏密码设置技巧)

小米投屏神器是一款智能电视投屏软件。当手机和电视在同一无线网络时,你可以轻松的把手机中的照片、视频投射到电视上,还可以轻松遥控智能电视。小米投屏神器内置小米电视...

家庭养殖致富项目有哪些,4个投资小收益高的养殖好项目

针对农村的创业项目,我一直坚持是要做好前期试错,不要着急,先从小开始,特别是养殖业这方面。那么,5000块钱在农村,目前可以做哪些非常赚钱的养殖项目?我这里推荐...

excel兼容包如何使用(1分钟了解excel兼容性的解决方法)

兼容性检查器发现了一个或多个与早期版本MicrosoftExcel之间的公式相关兼容性问题。默认情况下,从Excel2007起,兼容性检查器检查早期版本Exce...