秋招——MySQL补充——MySQL是如何加行级锁

news2024/9/19 10:39:14

文章目录

    • 引言
    • 正文
      • 什么SQL语句会加行级锁
        • 查询操作增加对应的行级锁
          • 事务的写法
        • update和delete修改操作也会增加行级锁
      • 行级锁有哪些种类
        • 记录锁
        • 间隙锁
        • Next-Key锁
      • MySQL是如何加行级锁?
        • 唯一索引等值查询
          • 查询记录是存在的
          • 查询记录是不存在的
        • 唯一索引范围查找
          • 针对大于或者大于等于的范围查询
          • 针对小于等于的范围查询
        • 非唯一索引等值查询
          • 记录不存的情况
          • 记录存在的时候
        • 非唯一 索引范围查询
        • 没有加索引的查询
    • 总结

引言

  • 在做一些SQL的过程中,总是对于行级锁会出现的一些理解上的问题,就找了一些资料,来补充一下,之前只不过是背过了,但是并不深刻理解。
  • 这里参考的都是小林coding的内容,链接
  • 这里是看了小林coding的内容,然后自己在进行二次消化总结,目录结构基本上是一致的。

正文

什么SQL语句会加行级锁

  • 普通的select语句不加行级锁,快照读,通过MVCC来实现的。

  • 两种类型的锁,分别是共享锁和独占锁

在这里插入图片描述

  • 共享锁S:满足读读共享,读写互斥。
  • 独占锁X:满足写写互斥,读写互斥。
查询操作增加对应的行级锁

查询加锁的方式有两种,枷锁的查询语句成为锁定读

S型锁

select ... lock in share mode;

X型锁

select ... for update;

注意

  • 加锁的读语句,必须要在一个事务中,因为事务结束了就会自动释放锁。
事务的写法

事务的书写方式!!!这里个东西吧,拼多多就问了,就是会问你实操!

使用start transaction

START TRANSACTION;  // 开启一个新事物
//..///不同的SQL语句

selet * from table_a where id = 1 for update;

COMMIT;// 最后事务要提交

使用begin实现事务

Begin;  // 开启一个新事物
//..///不同的SQL语句

selet * from table_a where id = 1 for update;

COMMIT;// 最后事务要提交
update和delete修改操作也会增加行级锁
  • 删除和修改操作增加的都是独占型锁X型锁
update table colA = x where id = 1;
delete from table where id = 1;

行级锁有哪些种类

  • 记录锁Record Lock

    • 紧紧锁住一条记录
  • 间隙锁Gap Lock

    • 锁定一个范围,但是不包含记录本身
  • Next-key锁

    • 记录锁和间隙锁的组合,锁定一个范围并且锁定记录本身。

不同隔离级别下,锁是不同的

  • 读已提交的情况下,是记录锁
  • 可重复读的情况下,是记录锁和间隙锁(防止幻读)
记录锁
  • 记录锁,同时有共享锁和独占锁,需要自己指定。
  • 默认是独占锁,所以不能对这条记录进行任何操作
begin;
select * from table where condition for update;
commit;
间隙锁
  • 用于可重复读隔离级别,是解决幻读问题。

  • 在一定范围内,不再插入其他的数据

  • 间隙锁之间是相互兼容的

  • 不包含自身

Next-Key锁
  • 是记录锁和间隙锁的结合体,锁住一个范围的同时,还锁住了自身。
  • 保护该记录,并且组织其他事务将新纪录插入到被保护的记录前面的间隙中。

不同Next-Key锁之间是互不兼容的

MySQL是如何加行级锁?

  • 加锁的对象是索引,加锁的基本单位是next-key锁,
  • 但是在能够使用记录锁或者间隙锁就能避免幻读的场景
    • next-key锁会退化为记录锁和间隙锁

加锁的对象是针对索引的!!!

唯一索引等值查询
  • 使用唯一索引,进行等值查询的时候,按照查询记录是否存在,将锁退化为两种不同的形态
查询记录是存在的
  • 索引树上定位到这条记录后,将记录中的next-key退化为记录锁

陷入阻塞

在这里插入图片描述
在这里插入图片描述

退化为记录锁的原因

  • 主键具有唯一性,插入一个同主键的key-value,不满足唯一性约束。
  • 加了记录锁,就无法删除该纪录。
查询记录是不存在的
  • 在查询树上找到第一条大于该查询记录的记录后,将该记录中的next-key锁退化为间隙锁。

在这里插入图片描述
确定间隙锁的范围

  • 大于当前搜索的id的最接近的一个值,以当前值右边界,然后前一个值就是左边界。
  • 在唯一索引等值擦查询并且记录不存在的情况下,在索引树找到第一条大于该查询记录的记录后,将该记录的索引next-key退化为间隙锁

使用间隙锁,保证右边界不会被锁,在限定范围内就可以保证不出现幻读

唯一索引范围查找

唯一索引范围查找过程

  • 会对每一个扫描到的索引,加上next-key锁,然后如果遇到下述情况,会退化成记录锁或者间隙锁。
针对大于或者大于等于的范围查询

大于的情况

  • 对两个不同的区域加上next-key锁,限定访问范围
    • 第一个匹配的主键索引上,增加(edge,value]的范围锁,限定在这个范围内不在增加新的数据。
    • 对于最后一个特殊暴击的主键的索引上,就增加一个(value,+∞】主键索引,限定在这个范围内,不在增加的新的数据。
      在这里插入图片描述

大于等于的情况

  • 在等值索引匹配上,增加了一个记录锁,限定当前的值不被修改。其余都是相同的。
    在这里插入图片描述
    总结
  • 针对大于等于条件的唯一索引范围查询的情况下,如果条件值得记录存在于表中,该查询是等值擦汗寻,所以该记录锁对应得索引中锁退化为记录锁
针对小于等于的范围查询
  • 第一个数据增加的是next-key锁,限定是(-∞,a]

    • 保证不能在a之前插入数据
  • 后续每一个索引,加的锁都是next-key锁,限定范围是(left_edge,right-edge】

    • 保证上一个匹配到当前匹配之间的范围内,不增加任何新的数据
  • 找到第一个不满足约束条件的索引,当前退化为间隙锁

    • 保证在最后一个匹配的样本,到第一个不匹配的样本的范围内,不会插入新的元素

在这里插入图片描述

非唯一索引等值查询
  • 当我们使用非唯一索引进行等值查询的时候,存在两个索引,一个主键索引,还有一个是非唯一索引
    • 加锁的时候,会同时对两个索引都加锁
    • 对主键索引加锁的时候,只有对满足查询条件的记录,才会对主键索引进行加锁。

查询记录存在并且使用的不是唯一索引

非唯一索引等值查询过程

  • 对整个表格进行扫描,直到扫描到第一个不符合条件条件的二级索引记录,就会停止扫描
  • 再扫描过程中,对于的扫描到的二级索引记录增加的是next-key锁,
  • 对于第一个不符合条件的二级索引记录,该二级索引的next-key锁退化为间隙锁,
  • 对于符合查询条件的记录的主键索引加上记录锁。
记录不存的情况
  • 首先会对非唯一索引进行排序,找到第一个不满足等值条件的记录,
    • 二级索引,退化为间隙锁。
      在这里插入图片描述

在这里插入图片描述

  • 能不能插入成功,是需要考虑到二级索引底层结构的实现,首先对二级索引进行排序,然后再具有相同二级索引的记录的主键索引进行排序。
    在这里插入图片描述
记录存在的时候

在这里插入图片描述

  • 加锁过程具体如下
    • 符合条件的记录的主键索引退化成记录锁
    • 二级索引当前锁保持不变
    • 第一个不满足条件的二级索引,退化为间隙锁。

在这里插入图片描述

非唯一 索引范围查询
  • 非唯一索引查询,索引的nextkey 不会退化成间隙锁和记录锁的情况,二级索引加的也是next-key锁
    • 满足条件的主键索引仍旧是记录锁

在这里插入图片描述
在这里插入图片描述

没有加索引的查询
  • 如果锁定读查询语句,没有使用索引列座位查询条件,或者查询语句没有走索引查询,导致扫描是全表扫描的
    • 每一条记录的索引上,都会加next-key锁,锁住全表

不走索引,只要是执行update、delete、for update都是锁住整个表

总结

  • 想想就难受呀,拼多多主管面,就剩下最后一面了,那个主管面,基本上什么都没答出来,很难受,但凡那里看了一遍,我都不至于面试面的那么差,而且很多东西都很基础,我就是忘记了。没注意到这些细节,很难受!
  • 不想了,技不如人,没有准备好,那几天太浪了,没有好好备战,活该吧!后续提前批,要加把劲!
  • 事情蛮多的,这里太细了,不过大概懂了就行了。今晚还得赶着刷两道题,还得写一个党政结课的论文。

所有的加锁还有所退化,都是的为了避免幻读!!

当前读一定要使用索引进行操作,否则就是全表锁住

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

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

相关文章

一个暑假如何学习单片机

一个暑假是学习和掌握单片机基础知识的良好时机。以下是一个关于如何在暑假期间学习单片机的建议计划: 1. 了解基础知识 查阅资料:首先,了解单片机是什么,它的工作原理、常见型号和应用场景。学习编程语言:单片机通常…

【区块链+基础设施】蜀信链 | FISCO BCOS应用案例

蜀信链是在四川省经济和信息化厅指导下,在四川省区块链行业协会组织下,由全省区块链相关从业与应用机构 共同参与建设和运营的区域性区块链基础设施,通过多方协同,共同打造合作共赢的区块链产业生态。 蜀信链区块链服务生态秉承“…

移动网络捕获在数字化转型中的重要性

数字化转型重新定义了企业运营和与客户互动的方式。它为组织提供价值的方式带来了根本性的转变,使流程更易于访问、更高效、更具协作性和更安全。然而,跟上不断发展的数字环境可能是一项挑战,而未能接受数字化转型的企业则面临被淘汰的风险。…

农作物监测新利器:免费可视化工具让数据说话

从传统的“靠天吃饭”到如今的“智慧农业”,数据成为了驱动这一转变的关键力量。随着物联网、大数据、云计算等技术的深入应用,农业生产过程中的各类数据如雨后春笋般涌现。从土壤湿度、光照强度到作物生长周期、病虫害情况等,这些数据背后隐…

电路模型和电路定律

电路---为了某种需要由某些电工设备或元件按一定方式组合起来的电流的通路 实际电路的两个作用 1.电能的传输,分配和转换 2.传递和处理信号 电路中的几个基本概念 激励---电源或信号源的电压或电流,也称为输入 响应---由激励在电路各部分产生的电流…

基于ESP32 IDF的WebServer实现以及OTA固件升级实现记录(三)

经过前面两篇的前序铺垫,对webserver以及restful api架构有了大体了解后本篇描述下最终的ota实现的代码以及调试中遇到的诡异bug。 eps32的实际ota实现过程其实esp32官方都已经基本实现好了,我们要做到无非就是把要升级的固件搬运到对应ota flash分区里面…

应用密码学—(扩展)欧几里得、DES、RSA、SHA-1算法

1. 欧几里得算法 1.1 分析算法的实现原理 欧几里德(Euclid)算法,也既常说的“辗转相除法”,公式为gcd(m, n) { return gcd(n, m%n); },对于任意两个正整数m、n,每次求的一个数字r m % n,然后把…

气膜馆一小时电费有多高—轻空间

气膜馆因其独特的设计和功能性,广泛应用于体育场馆、展览馆和临时建筑等多个领域。除了其便捷的搭建和拆卸外,运营成本,尤其是电费,成为了许多关注气膜馆用户的重点。轻空间将详细分析气膜馆一小时的电费构成,并探讨其…

跨境电商自养号全攻略:TEMU、Shein、速卖通测评技巧揭秘

TEMU、Shein、速卖通等跨境平台都推出了全托管模式,普通平台讲究排名,销量,流量量,转化率等等。那么全托管为什么需要做测评呢?因为全托管平台讲究的是一个动销率,有的新品上架或许很快就出单,而…

【每日一练】Python遍历循环

1. 情节描述:上公交车(10个座位),并且有座位就可以坐下 要求:输入公交卡当前的余额,只要超过2元,就可以上公交车;如果车上有空座位,才可以上。 seat 10 while seat > 0:money int(input(…

2024 年如何构建 AI 软件

人工智能 (AI) 是当今 IT 行业最热门的话题,受到大型科技公司、大型企业和投资者的青睐。如果有人不参与 AI,他们就出局了。虽然“AI 泡沫”一词尚未公开使用,但街上的每个人都可能听说过 AI 将取代我们的工作(可能不会&#xff0…

文献解读-长读长测序-第十四期|《作为了解棉花驯化的资源,印度棉(Gossypium herbaceum L. Wagad)基因组》

关键词:基因组;长读长测序;棉花基因组; 文献简介 标题(英文):The Gossypium herbaceum L. Wagad genome as a resource for understanding cotton domestication标题(中文&#xff…

【论文解读】iSDF: Real-Time Neural Signed Distance Fieldsfor Robot Perception

《iSDF: Real-Time Neural Signed Distance Fields for Robot Perception》提出了一种用于实时签名距离场(SDF)重建的持续学习系统。 论文:https://arxiv.org/abs/2204.02296https://arxiv.org/abs/2204.02296 项目:iSDFhttps:/…

手撕LLM,弄懂这些,你大模型就算入门了

在人工智能的浩瀚星空中,大型语言模型(Large Language Model, LLM)无疑是近年来最为耀眼的星辰之一。它们以惊人的文本生成能力、上下文理解能力以及广泛的应用潜力,正逐步改变着我们的生活方式和工作模式。对于想要踏入这一领域的…

Mac密室逃脱游戏推荐:Escape Simulator for mac安装包

Escape Simulator 是一款逃生模拟游戏,玩家在游戏中需要寻找线索、解决谜题,以逃离各种房间或环境。这种类型的游戏通常设计有多个关卡或场景,每个场景都有不同的设计和难度。 在 Escape Simulator 中,玩家的目标通常是找到出口或…

用MySQL+node+vue做一个学生信息管理系统(一):配置项目

先用npm init -y生成配置文件 在项目下新建src文件夹,app.js文件。src目录用来放静态资源文件,app.js是服务器文件,index.js是vue的入口文件 使用npm install express下载express框架 在app.js文件夹开启node服务,监听的端口为…

开放式耳机排行榜10强!最强开放式耳机大揭秘!

在开放式耳机的市场中,各大品牌竞相推出了一系列优秀的产品。这些耳机不仅具备高品质的音质表现,还融入了各种黑科技,如智能降噪、无线充电等,带来更加便捷、智能的体验。作为一名开放式耳机收藏家,目前也入手了差不多…

java入门-基础语法(运算符)

运算符是对变量、字面量进行运算的 符号 (一)基本的算术运算符、符号做连接符 (1)基本运算符:(加), - (减)、 * (乘)、 / (除)、%&…

仿论坛项目--初识Spring Boot

1. 技术准备 技术架构 • Spring Boot • Spring、Spring MVC、MyBatis • Redis、Kafka、Elasticsearch • Spring Security、Spring Actuator 开发环境 • 构建工具:Apache Maven • 集成开发工具:IntelliJ IDEA • 数据库:MySQL、Redi…

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

🔥 个人主页:空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo? 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…