mysql InnoDB存储引擎的锁机制

news2025/8/9 13:19:10

目录

前言

1. 锁的分类

1.1 实现方式

1.2 锁的粒度

2. 查询操作加锁方式

2.1 一致性非锁定读

2.2 一致性锁定读

3. 锁的算法

4. 锁的升级

5. 死锁

6.总结


前言

        锁机制的目的是最大程度提高数据库的并发访问,另一方面确保可以以一致的方式读取和修改数据。了解mysql的锁的相关知识,可以在处理涉及数据库的并发操作问题时,有正确的判断和处理方法。打算梳理这些东西的起因是项目组里有一个同事,张口数据被加锁,闭口死锁了,这个问题没法处理,总是推脱,然后自己也说不清原因,可见他对锁的认识并不深入,但我又不好当面直接说驳了他的面子,仅以此文梳理并加以分享,希望有小伙伴在面对类似情况时,可以侃侃而谈,不至于模模糊糊说不清。

1. 锁的分类

1.1 实现方式

        锁机制是用于管理对共享资源的并发访问。InnoDB支持行级锁,按照锁的实现方式,InnoDB实现了两种标准的行级锁:

        共享锁(S Lock):允许事务读取一行数据;

        排他锁(X Lock):允许事务删除或更新一行数据;

        举个例子:如果一个事务t1已经获取了行n的共享锁,那么另一个事务t2可以立即获得行n的共享锁,因为读取操作没有改变行n的数据,所以这种情况叫作锁的兼容()。如果另外有一个事务t3想获得行n的排他锁,那么这时需要等待事务t1、t2释放行n上的共享锁才行,t3等待的过程处于阻塞状态,这种情况就是锁不兼容。

        通过例子可以得出以下结论:

  1.  排他锁与共享锁不兼容;
  2.  排他锁与排他锁不兼容;
  3.  共享锁与共享锁是兼容的;
  4.   共享锁与排他锁不兼容;

        来一个表格更直观一些,另外需要注意的是共享锁与排他锁都是行级锁,兼容是指结同一行数据而言的。

排他锁

共享锁

排他锁

不兼容

不兼容

共享锁

不兼容

兼容

1.2 锁的粒度

        InnoDB存储引擎还支持多粒度的锁定,即允许事务在行级上的锁和表级上的锁同时存在。这种在不同粒度上的锁定称为意向锁,可以将锁定的对象分为多个层次,在更细的粒度上进行加锁的操作,所以意向锁又分为两种实现方式:

        意向共享锁(IS Lock)事务想要获取表中某几行数据的排他锁;

        意向排他锁(IX Lock)事务想要获取表中某几行数据的共享锁;

        举个例子:如果需要对页上的行记录n上加排他锁,那么需要分别对其所在的数据库、表、页上意向锁,最后对行记录n上排他锁。假如在给行记录n上排他锁前,已经有事务给行n所在的表上了共享锁,那么由排他锁与共享锁的不兼容,就需要等待已有的事务结束,共享锁释放后,才能继续。

        需要特别注意的是:共享锁和排他锁锁定的是一行数据,意向共享锁和意向排他锁锁定的是几行,因此意向锁共享锁和意向排他锁不是锁定的相同几行数据,相互之间是锁兼容的。

2. 查询操作加锁方式

        InnoDB查询操作有两种读取方式,本质是两种加锁方式:一致性非锁定读和一致性锁定读。

2.1 一致性非锁定读

        InnoDB默认事务隔离级别为可重复读,InnoDB默认读取方式为一致性非锁定读。举个例子说明一下什么是一致性非锁定读?如果读取数据行n时,行数据n正在执行delete或update操作而被锁定,那么读取的操作不会因此去等待行n上的锁释放,而是直接去读取行n的快照数据,所谓以快照数据就行n锁定之前的版本数据。一致性非锁定锁极大提高了数据库的并发性,所以才是InnoDB默认的读取方式。

        需要特别注意的是,不同的事务隔离级别下读取的数据有区别,这主要是因为不同事务隔离级别下对快照数据的定义不同。因为一条行记录可能有不止一个快照数据,因不同版本并发控制产生的技术,就是传说中的多版本控制(MVCC),但这并不是这里要讲述的重点。

  • 在事务隔离级别为read commited(读已提交),读取被锁定行的最新一份快照数据。
  • 在事务隔离级别为repeatable read,可重复,读取事务开始时的行数据版本。

        这好像也没看出来具体到底有什么区别?别急,举个例子就明白了:

  1. 时间列表示会话操作的时间节点顺序,
  2. 在时间节点1会话1开启事务,在时间节点2执行了查询操作;
  3. 时间节点3时,会话2开启事务,时间节点4执行了一个与时间节点2相同的条件的更新操作,这时id=1的行其实加了一个排他锁;
  4. 时间节点5会话1再执行id=1的查询操作,如果事务隔离级别是读已提交,那么读取被锁定行的最新一份快照数据id是1,因现在会话2的更新操作的事务还未提交,读取已提交的肯定还是id=1; 如果事务隔离级别是可重复读,读取事务开始时的行数据版本也是id=1;所以不管不管事务的隔离级别是读已提交,还是可重复读,结果是一样的。
  5. 时间节点6会话2提交了事务,加在id=1的行上的排他锁释放,在时间节点7再执行查询操作,这时读已提交和可重复读两种事务隔离级别下的结果是不同的。如果是读已提交,由于会话2的更新操作事务已提交,读取最新的一份快照数据id=3了。如果是可重复读,读取事务开始时行数据的版本,由于会话1事务未提交,事务开始时数据的版本是id=1。

时间

会话1

会话2

1

begin

2

select * from table1 where id=1;

3

begin

4

update table1 set id=3 where id=1;

5

select * from table1 where id=1;

6

commit;

7

select * from table1 where id=1;

8

commit;

        通过例子可以了解一个事实:一致性非锁定读在不同的事务隔离级别下读取的结果可能不同,也可能相同,关键在于时机。可以根据实际的场景,显性指定合适的事务的隔离级别。

2.2 一致性锁定读

        InnoDB默认事务隔离级别可重复读时,select查询使用一致性非锁定读,但是用户可以显性对数据库查询操作指定为一致性锁定读。

        两种一致性锁定读的操作:

select ... for update;

select ... lock in share mode;

        select ... for update对读取记录加排他锁,其他事务不能对加排他锁的行上加任何锁,因为锁不兼容;select ... lock in share mode对读取行记录加共享锁,其他事务可以向被锁定的行加共享锁,但不能是排他锁,因为锁不兼容,其事务也会阻塞。

3. 锁的算法

---未完待续,敬请期待

4. 锁的升级

---未完待续,敬请期待

5. 死锁

---未完待续,敬请期待

6.总结

        处理数据并发问题时,绝不能想当然,搞清楚数据库是什么版本存储引擎?事务隔离级别是什么?读取操作加锁方式是什么?这些信息搞清楚,才是分析并发问题的第一步。

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

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

相关文章

Camunda工作流引擎简记

本文转载自玩转Camunda之实战篇-赶紧收藏起来吧_哔哩哔哩_bilibili 其中部分内容,经过本人修改 一、工作流相关介绍 BPM(BusinessProcessManagement),业务流程管理是一种管理原则,通常也可以代指BPMS(BusinessProcessManagementSuite)&#…

火山引擎 DataTester 应用故事:一个A/B测试,将产品DAU提升了数十万

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 疫情让线下的需求大量转移到线上,催生出了远程办公、网络授课、线上健身等新的生态现象。如何更好地为用户服务,提升用户体验,成…

计算机的组成

文章目录五大部件1) 输入设备2) 存储器3) CPU(中央处理器)4) 输出设备五大部件 所有类型的计算机,其本质都是接收用户输入的原始数据,并将其加工、处理成对用户有用的数据,它们都支持执行如表 1 所示的 5 项基本操作。…

SpringCloud Sentinel 使用

哈喽~大家好,SpringCloud Sentinel 使用。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏:【微服务】 🥉推荐专栏: JavaEE框架 目录 一、前言 1、什么是Sentinel&…

时间复杂度和空间复杂度【一学就会】

目录 🥇1.算法效率 🔎2.时间复杂度 📗2.1 大O渐进表示法 📘2.2 时间复杂度的练习(没有说明即最坏情况) 🔑3.空间复杂度 🌈如何评价一个代码呢?它的效率高不高&#…

美创科技发布数据安全综合评估系统|推进安全评估高效开展

数字化深入的今天,数据价值和风险相伴相生,让数据要素发挥更大价值,提高风险预见预判,数据安全评估日益紧迫和必要。《数据安全法》提出:“重要数据处理者应对其数据处理活动定期开展风险评估,并向有关主管…

精彩回顾|关系网络赋能银行数字化转型的应用与实践

本文是根据11月10日Galaxybase图创课堂:乘金融科技之风:关系网络赋能银行数字化转型的应用与实践整理,错过的小伙伴们可以观看回放:https://uao.so/pct862806 精彩回顾 近年,知识图谱的重要性和实际应用逐步呈上升趋…

十大排序(总结+算法实现)

十大排序&#xff08;总结算法实现&#xff09; 十大排队的性能分析 冒泡排序 使用冒泡排序&#xff0c;时间复杂度为O(n^2),空间复杂度为O(1) 像气泡一样从低往上浮现 vector<int> bubbleSort(vector<int>nums) {int lengthnums.size();for(int i0;i<lengt…

PreScan快速入门到精通第三十七讲PreScan中使用深度摄像机

深度相机提供了一个 "相机"图像,其中包含深度值,而不是颜色。它提供的地面真实数据可用于校准或验证立体相机的深度计算。 对象配置 系统选项卡 变量 描述 …

antd——a-tree-select 树形选择控件 与 a-cascader 级联选择器 的对比——技能提升

在遇到 省市区多级联动数据的时候&#xff0c;经常会用到的就是 a-cascader级联选择器。 1.级联选择器的使用方法 1.1 需要指定数据源——options 数据结构是 对象数组嵌套——value/label/children <a-cascader :options"options" placeholder"Please sele…

SpringBoot3 正式发布:有哪些新玩法?

SpringBoot 3.0现已正式发布&#xff0c;可以在Maven Central中找到。 这是自四年前发布2.0以来的第一个主要版本。 它也是SpringBoot的第一个GA版本&#xff0c;提供了对Spring Framework 6.0和GraalVM的支持。 一文详解&#xff5c;从JDK8飞升到JDK17&#xff0c;再到未来…

Tesla M40 下Ubuntu anaconda pycharm安装

显卡&#xff1a;Tesla M40 24GB (2张&#xff09; 显卡驱动版本(推荐)&#xff1a;470.57.02 cuda版本&#xff1a;11.4 安装前需要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;禁用nouveau驱动&#xff01;&#xff01;&#xff01;&#xff01;&#x…

php中通用的excel导出方法实例

一.普遍导出方法 excel导出的方法网上有很多&#xff0c;在crm或是oa系统中导出excel是常有的事&#xff0c;做过的此功能人都知道&#xff0c;其主要操作其实是循环数据列表&#xff0c;然后一格一格地添加数据到固定的单元格中。只要做好了一次&#xff0c;其后只要复制相关…

外汇天眼:2022 年世界杯已经开始,但这将如何影响外汇交易?

关于 2022 年世界杯 2022年世界杯于2022年11月20日在卡塔尔拉开帷幕&#xff0c;将持续到2022年12月18日。2022年国际足联世界杯是由国际足联成员协会的男子国家队和第22届国际足联世界杯举办的国际足球锦标赛。这是第一次在阿拉伯世界举办的世界杯。 关于中东 尽管经历了疫情…

MCE | KRAS 突变型肺癌耐药性探索

KRAS 是一种致癌基因&#xff0c;编码 KRAS 蛋白 (一种 small GTPase 转导蛋白)。KRAS 通过结合 GTP/GDP 控制其活跃状态&#xff0c;进而控制其信号传递和下游级联反应。致癌性 KRAS 突变会破坏 GTPase 活性&#xff0c;进而使 KRAS 蛋白锁定在活跃状态下&#xff0c;从而使启…

【面试题】JS基础-异步

1. 异步 1.1 为什么要异步&#xff1f; JS是单线程语言&#xff0c;只能同时做一件事。JS和DOM渲染共用同一个线程&#xff0c;因为JS可修改DOM结构。当遇到等待的情况时&#xff0c;例如网络请求、定时任务&#xff0c;程序不能卡住。所以需要异步来解决JS单线程等待的问题&…

学完Spring框架回头再来看反射你会发现真的不一样

文章目录前言一.什么是反射&#xff1f;二.如何实现反射&#xff1f;2.1java.lang.Class2.2通过反射创建对象2.3通过反射获取类成员三.反射的性能四.反射是如何破坏单例模式的&#xff1f;五.如何避免单例模式被反射破坏&#xff1f;前言 你还记得你的Spring入门案例吗&#x…

查询利器—索引

目录 索引的优缺点 常见索引分类 MySQL数据操作的宏观过程 认识磁盘 正式理解索引结构 采用B树的原因 聚簇索引与非聚簇索引 索引操作 索引创建原则 索引的优缺点 优点&#xff1a;提高一个海量数据的检索速度 缺点&#xff1a;查询速度的提高是以插入、更新、删除…

pdf生成:wkhtmltopdf

wkhtmltopdf是开源&#xff08;LGPLv3&#xff09;命令行工具&#xff0c;使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。这些完全以“headless”模式运行&#xff0c;不需要显示或显示服务wkhtmltoimage。建议&#xff1a; 不要将wkhtmltopdf与任何不受信任的HTML一起…

sqli-labs/Less-61

这一关的欢迎界面提示我们尝试机会为5次 然后要以id为注入点 首先先判断一下是否为数字型 输入id1 and 12 回显如下 所以属于字符型 然后输入1 回显如下 出现了报错信息 说明可以进行报错注入 也说明了注入类型 佐证一下 输入一个1))--回显如下 这道题我还是使用报错注入 首…