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

文章目录

    • 引言
    • 正文
      • 什么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.mzph.cn/news/865193.shtml

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

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》8.4 COUNTIF函数

8.4 COUNTIF函数 COUNTIF函数是Excel中常用的统计函数之一,用于统计指定条件下的单元格数量。通过COUNTIF函数,我们可以轻松地对数据进行条件筛选和统计分析。下面将从函数简介、语法、基本用法、注意事项、高级应用、实战练习和小节几个方面展开介绍。…

爬虫笔记19——代理IP的使用

访问网站时IP被阻止 有些网站会设置特定规则来限制用户的访问,例如频率限制、单一账户多次登录等。 网站为了保护自身安全和用户体验,会设置防御机制,将涉嫌恶意行为的IP地址加入黑名单并屏蔽访问。如果用户在使用网站时违反了这些规则&…

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策,NTFS与exFAT作为主流的文件系统,用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT,格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

十四、【源码】@Autowired、@Value、@Component

源码地址:https://github.com/spring-projects/spring-framework 仓库地址:https://gitcode.net/qq_42665745/spring/-/tree/14-auto-property Autowired、Value、Component 注解注入属性的实现分散在refresh容器的各个方法中,梳理&#x…

docker 搭建 AI大数据模型 --- 使用GPU

docker 搭建 AI大数据模型 — 使用GPU方式 搭建本地大模型,最简单的方法!效果直逼GPT 服务器GPU系统HP580 G8P40Rocky9.2 安装程序AnythingLLM前端界面Open WebUIChatOllamaollama 一、AnythingLLM 介绍 AnythingLLM 是 Mintplex Labs Inc. 开发的一…

9.(vue3.x+vite)修改el-input,el-data-picker样式

效果预览 二:相关代码 <template><div style="padding: 50px"><el-input placeholder="请输入模型名称" style="width: 260px" /><br /

Java灵活用工2.0报价单微信小程序+APP+微信公众号 源码

&#x1f680;【开篇&#xff1a;解锁灵活用工的高效时代】 在人力资源市场日益灵活的今天&#xff0c;如何快速、准确地生成报价单&#xff0c;成为企业吸引并管理自由职业者的关键。而“灵活用工报价单微信小程序APP微信公众号源码”正是这样一款集高效、便捷于一体的解决方…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…

【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类

类的设计目标是为了实现 RGB 相机与 ToF 深度传感器之间的高精度校准&#xff0c;从而使两种类型的数据能够在同一个坐标框架内被整合使用。这在很多场景下都是非常有用的&#xff0c;比如在3D重建、增强现实、机器人导航等应用中&#xff0c;能够提供更丰富的场景信息。 -----…

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络&#xff08;CNN&#xff09;中为什么可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的感受野 flyfish 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的…

交叉编译tslib库和上机测试

目录 一、tslib 介绍 二、tslib 框架分析 三、交叉编译、测试 tslib 1.安装工具链 tslib &#xff08;1&#xff09;设置交叉编译工具链 &#xff08;2&#xff09;进入tslib目录 &#xff08;3&#xff09;安装工具链 &#xff08;4&#xff09;确定工具链中头文件、库…

千亿级市场迎来新增量:中老年K歌需求高涨,解读线上+线下创新方向

干货抢先看 1. 我国KTV产业一度达到千亿规模&#xff0c;近年来随着线下娱乐方式多样化&#xff0c;KTV逐渐被年轻用户抛弃&#xff0c;中老年成为行业关键增量。 2. 数据显示&#xff0c;全国量贩式KTV中&#xff0c;60-70岁年龄段用户数同比增长29.6%&#xff0c;订单量同比…

【分布式系统】监控平台Zabbix介绍与部署(命令+截图版)

目录 一.Zabbix概述 1.为什么要做监控 2.zabbix 是什么 3.zabbix 监控原理 4.zabbix 6.0 新特性 5.zabbix 6.0 功能组件 Zabbix Server 数据库 Web 界面 Zabbix Agent Zabbix Proxy Java Gateway 补充 二.部署安装Zabbix 6.0 1.初始化环境 2.安装nginx跟php&am…

计算机网络网络层复习题2

一. 单选题&#xff08;共22题&#xff0c;100分&#xff09; 1. (单选题)如果 IPv4 数据报太大&#xff0c;会在传输中被分片&#xff0c;对分片后的数据报进行重组的是&#xff08; &#xff09;。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…

图文控件TextImageView

图片文字组合控件&#xff0c;可以灵活的控制图片大小 class TextImageView : AppCompatTextView {private var mStartWidth: Int 0private var mStartHeight: Int 0private var mTopWidth: Int 0private var mTopHeight: Int 0private var mEndWidth: Int 0private var …

不懂PyQt5垂直布局?只需3分钟即可学会

PyQt5中实现垂直布局&#xff0c;主要使用QVBoxLayout类。该布局管理器将子控件垂直排列&#xff0c;并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…

一个例子理解傅里叶变换的计算过程

假设我们有一个简单的信号&#xff0c;由两个不同频率的正弦波组成&#xff0c;我们希望通过傅里叶变换来分析其频谱。 示例信号 假设我们有一个信号 &#xff1a; 这个信号由两个频率成分组成&#xff1a;一个50 Hz的正弦波和一个120 Hz的正弦波&#xff0c;后者的振幅是前者…

昇思MindSpore学习入门-静态图像加速

使用静态图加速 背景介绍 AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介绍如下&#xff1a; 动态图模式 动态图的特点是计算图的构建和计…

catia数控加工仿真铣平面粗加工

1&#xff0c;零件建模&#xff0c;毛坯建模 2 在毛坯上建立坐标系 3 添加资料刀具 4&#xff0c;双击对相关加工信息做设置 5 Roughing 加工设置 高亮红色区域是必选的&#xff0c;其他可以默认 6 完成加工仿真 7 加工余量