Mysql加锁算法

news/2025/3/18 11:08:31/文章来源:https://www.cnblogs.com/zero01one/p/18778532

读未提交下:

  • 增:插入数据后,给新插入的数据上记录锁,防止其它事务更改这条记录

  • 删:需要获取到要删除的记录的记录锁,保证删除的时候其它事务没在使用这些数据,并保证删除后其它事务无法对这些数据进行操作

  • 改:给需要更改的数据上记录锁

  • 查:普通select不上锁,直接读最新数据,不管是否提交,select…for update 或 select … lock in share mode会上记录锁,不锁间隙!

读已提交下:

  • 增:插入数据后,给新插入的数据上记录锁,防止其它事务更改这条记录

  • 删:需要获取到要删除的记录的记录锁,保证删除的时候其它事务没在使用这些数据,并保证删除后其它事务无法对这些数据进行操作

  • 改:给需要更改的数据上记录锁

  • 查:普通select不上锁,通过MVCC找到读取的数据,select…for update 或 select … lock in share mode会上记录锁,不锁间隙!

可重复读下:

  • 增:使用插入****意向锁,进行插入,插入后给插入的数据上记录锁(隐式锁,其实这个记录锁不是这个时候上的)

  • 删:使用临键锁,防止其它事务在删除的区间内插入数据

  • 改:给需要更改的数据上临键锁

  • 查:普通select不上锁,通过MVCC找到读取的数据,select…for update 或 select … lock in share mode会上临键锁,锁间隙!

串行化读下:

  • 增:使用插入****意向锁,进行插入,插入后给插入的数据上记录锁(隐式锁,其实这个记录锁不是这个时候上的)

  • 删:使用临键锁,防止其它事务在删除的区间内插入数据

  • 改:给需要更改的数据上临键锁

  • 查:普通查询自动变为select … lock in share mode,上临键锁,锁间隙

上面上锁具有以下细节:

  • 这些锁的释放是在事务提交后释放

  • 删除操作和更新操作其实是差不多的,因为删除其实本质就是把行记录的一个逻辑删除标识位给改了,就相当于更新

  • MVCC只有在读已提交和可重复读中才有

  • 间隙锁只有在可重复读和串行化读中才有

  • 读已提交相对于读未提交只多了个MVCC,用于解决数据可见性问题,保证读到的是已提交的数据

  • 可重复读相对于读已提交相当于把记录锁升级为临键锁,解决(大部分)幻读情况

  • 串行化读相对于可重复读相当于普通读会上锁,解决全部幻读情况

更新操作怎么上锁?

  1. 例如有字段a,b,c,其中a,b字段上有索引

  2. update table set a = 1 where a = 2; 该SQL会先去a索引获取锁,然后去聚集索引获取锁,全部获取到后进行更新,不会去b索引上获取锁,因为该SQL没有更新b索引上数据(b索引的叶子节点数据只有b和id)。此时更新聚集索引是直接更新, 但更新a索引是先删后插的形式,以此来保证索引更新前后的有序性

  3. update table set id = 1 where a = 2;该SQL会先去a索引获取a=2锁,然后去聚集索引获取锁,然后去b索引上获取锁(隐式锁),全部获取到后进行更新,更新各个索引的数据页的id值,此时更新聚集索引是先删后插保证索引有序性,a和b索引都是直接更新对应记录的id即可

  4. update table set c = 3 where a = 2;该SQL会先去a索引获取a=2的锁,然后去聚集索引获取锁,然后更新c

删除操作会上什么锁?

和更新操作差不多,根据where后面的条件,看先去哪个索引上删除,例如 where id = 1,就先去聚集索引获取锁,聚集索引获取到锁后再去各个辅助索引获取到对应的锁,只有获取到全部索引上的锁后才能真正的删除,否则阻塞;如果是where a = 1,那就先去a这个索引上获取锁,获取到后再去聚集索引获取锁,然后再去其它索引树上获取,同样只有获取到全部索引上的锁后才能真正的删除,否则阻塞

  • 对于唯一索引:如果要删的数据不存在,则上间隙锁,锁住不存在的那块间隙;如果存在,则上记录锁

  • 对于非唯一索引:如果要删的数据不存在,则上间隙锁,锁住不存在的那块间隙;如果存在,上临键锁(可重复读及以上隔离级别),开始扫描符合条件的记录,这时如果发生阻塞(记录锁之间的阻塞,间隙锁可以共存),就直接阻塞,直到对方释放锁,然后才继续扫描剩下符合条件的记录,上锁算法与上面相同,也会对扫到的数据去聚集索引上上锁

select … lock in share mode 和 select … for update 有什么区别

select … lock in share mode,上的是共享锁:

  • where后面是主键——则在主键上进行锁算法扫描

  • where后面是辅助索引——如果索引覆盖,那么就只在本索引树上加锁;如果需要回表,那就还需要去主键索引上锁(看似有缺陷,主键索引读写冲突无法阻塞)

select … for update,上的是独占锁:

  • where后面是主键——则在主键上进行锁算法扫描

  • where后面是辅助索引——不管需不需要回表,在本索引树上获取锁后,都需要去主键索引上锁

共享锁和独占锁?

  • 共享锁和共享锁之间互相兼容,可以同时存在

  • 独占锁和其他任何锁都不兼容,不能同时存在

  • 一个资源上已经有共享锁时,不能再加独占锁

  • 一个资源上已经有独占锁时,不能再加任何锁

插入操作的流程?

有锁冲突(插入意向锁与间隙锁的锁冲突)的情况:

加插入意向锁——等待其它事务的间隙锁释放——其它事务的间隙锁释放——插入一条数据

无锁冲突(插入的点所处的区间没有间隙锁)的情况:

插入一条数据

可以看到,插入意向锁只有在不能直接插入数据,需要等待其它事务释放间隙锁,也就是发生锁互斥的情况下,才会存在!

插入完成,但事务还没提交,如果这时候有其他事务来更改插入的这一行数据会怎样?

事务既然还没提交,那么就不应该让其它事务更改,但我们根据上面的插入流程发现,是没有手段防止其它事务更改的,这就用到了隐式锁

设插入的数据叫数据行a,当其他事务有操作到a时(如更改a,删除a,插入a,select…lock in share mode,select…for update)时,判断a上是否存在活跃的事务,如果存在,则其它事务为 insert 事务创建一个排他记录锁,并将自己加入到锁等待队列;

也就是说insert不会给插入的记录上锁,但是其它事务会判断insert的那个事务还有没有存活,有的话帮他上个记录锁,然后把自己阻塞住,等待insert的那个事务提交或回滚,这种记录锁就是隐式锁。不由insert的事务上锁,而是其它事务帮其上锁

如果其它事务在本事务插入后,把插入的这个间隙上了个间隙锁,此时本事务对插入的数据的记录锁也会显露出来,也是其它事务帮忙上的,一旦显露出来,就是记录锁,而不是插入意向锁了

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

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

相关文章

虚幻unreal4.27源码编译编辑器流程与问题汇总

当你使用的是源码编译的虚幻unreal编辑器https://github.com/orgs/EpicGames/teams/developers搜索到你想要的版本对应的分支,并进入切换或者从这里下载稳定发布版。(注意下载4.27.2压缩包可能才380+M,解压后要113G+,所以最好预留空间120G) 在这里键入cmdH:\UnrealEngine-…

安装并运行Cloudreve个人网盘:详细步骤指南

安装并运行Cloudreve个人网盘:详细步骤指南 在本文中,我们将指导您如何安装并运行Cloudreve个人网盘,以及如何将其与阿里云OSS集成,实现高效的文件存储和管理。 步骤 1: 下载Cloudreve安装包 首先,您需要下载Cloudreve的安装包。请在您的Linux终端中执行以下命令: bash复…

算法心得(4)**快速排序和归并排序**

我们这里讨论的排序是把数组元素排成从小到大的顺序(升序) **快速排序** 先直接上模板: /***************** function:对数组进行快速排序* para:q[](待排序数组),l(数组左边界),r(数组右边界)* return:void*/ void fastSort(long long q[], int l, int r) {if (l >= r…

Redis应用_会话管理

Redis应用——会话管理 ​ 会话管理的核心是跟踪用户的会话状态,通常为每个用户分配一个唯一的会话 ID(Session ID),将用户的相关信息存储在服务器端,并通过该 ID 进行关联和查询。Redis 可以作为存储会话信息的数据库,将会话 ID 作为键,用户信息作为值进行存储。 一、配…

2025版PLM选型标准:10个行业TOP3厂商适配性对比

产品生命周期管理(PLM)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。随着时间的推移,到 2025 年,不同行业对于 PLM 系统的需求更加多样化和精细化。选择一款适配自身行业特点的 PLM 系统,成为众多企业提升竞争力的关键举措。接下来,我们将深入探讨 10 个…

对象存储COS 云顾问:安全管理重磅升级,守护数据安全!

导语 在数字化浪潮下,对象存储 COS 作为海量数据的核心载体,安全防护能力至关重要。存储桶配置不当可能引发数据泄露、流量盗刷等安全问题,因此腾讯云对象存储 COS 基于云顾问的云巡检能力,正式推出全新「安全管理」功能,通过智能巡检、多维评估、实时管控三大核心能力,为…

小程序和APP抓包的问题

小程序和APP抓包的问题 很多同学都会遇到小程序和APP抓不到包的问题,抓不到https请求包,这边给大家提供一些解决方案。 Yakit工具 首先需要的就是一个抓包神器yakit,这个工具非常好用强大,具体安装和使用大家可以参考上一篇文章。 PC端小程序抓包 PC端可以采用双层代理的方…

【多届检索稳定医工交叉会议|EI检索稳且快】-第六届医学人工智能国际学术会议(ISAIMS2025)

大会简介 第六届医学人工智能国际学术会议(ISAIMS 2025)将于2025年10月24-26日于中国西安召开。会议自2020年至今已经成功举办五届,吸引了来自海内外相关领域学者千余名。本届会议将继续围绕人工智能在医学领域的最新研究成果,为来自国内外高等院校、科学研究所、企事业单位…

ChatGLM一键微调

阿里云平台配置DSW交互式建模实例创建每一步记得点击开始,一定要一个个点,下载完在点下一个最后完成之后,点击生成的地址跳转Demo页面Demo页面

关闭 WSL 中正在运行的 Linux 发行版

你使用 WSL 在 Windows 内运行 Linux 吗?你想知道如何关闭在 WSL 中运行的 Linux 发行版吗? 你当然可以在 WSL 中运行的 Linux 系统中 执行 shutdown 命令:sudo shutdown now你还可以使用 wsl 命令关闭 Linux 系统。如果你有多个发行版在 WSL 中运行,这是一种极好的方法。 …

windows如何调出剪贴板所有复制过的内容?

前言 大家好,我是小徐啊。我们在开发Java应用的时候,经常是需要复制粘贴的。我们在windows上面开发的时候,默认都是复制后,就把之前的复制的内容替换了。这就导致我们的复制粘贴很不方便,其实,windows可以支持我们显示最近所有的复制内容的,具体怎么做呢?文末附快捷键方…

AI与.NET技术实操系列(七):使用Emgu CV进行计算机视觉操作

引言 计算机视觉(Computer Vision, CV)是人工智能领域中最为引人注目的分支之一。从自动驾驶汽车到医疗影像分析,从智能安防系统到虚拟现实体验,计算机视觉的应用无处不在,深刻地改变着我们的生活和工作方式。 对于.NET开发者而言,掌握计算机视觉技术不仅意味着能够开发出…