mysql面试(七)

前言

本章节列出了mysql在增删改查的时候,分别会涉及到哪些锁类型,又是如何交互的。
这个章节也是mysql面试基础系列的最后一章,后面准备更新redis数据类型和分布式锁相关问题。如果各位看官有什么问题的话,可以留言。

之前我们也有说关于多事务并发,会出现三种情况:脏读、不可重复读、幻读
对应的解决手段呢,分四个隔离级别:

  • 在Read uncommitted 读未提交隔离级别下, 脏读 、 不可重复读 、 幻读 都可能发生。
  • 在 Read committed 读已提交隔离级别下, 不可重复读 、 幻读 可能发生, 脏读 不可以发生。
  • 在 Repeatable Read 可重复读隔离级别下, 幻读 可能发生, 脏读 和 不可重复读 不可以发生。
  • 在 Serialiazble 串行化隔离级别下,上述问题都不可以发生。

那么实现这些隔离级别的手段是不太一样的。

读已提交很简单,事务提交之后才可以读取。

实现可重复读主要手段是MVCC机制,这个在之前我们也详细讲过具体的实现逻辑了

串行化这种最严谨的隔离级别,简单理解的话就是如果多个事务操作同一条数据,无论是读、写,都要一个个排队来执行,那如何实现这个排队执行呢,就要引入这个锁的概念了。

每当一个事务想要来操作这个数据的时候,就会生成一把锁

总的来说,锁这个概念就是用于公共资源的并发控制

分类

  • 共享锁:share lock 一般称为S锁,或者称为读锁,给一条数据加了这个锁之后,其他事务也可以来加这个S锁来读,但是不能写。
  • 独占锁:exclusive 一般称为X锁,或者称为写锁,当数据被加了这个锁之后,其他事务不可以写也不可读。
  • 意向锁:IS或者IX,当事务给记录加了行锁之后,会在表级别加上对应的意向锁,告知其他事务。还有一种是行级别的意向锁。后面细说

PS:只有S锁和S锁可以相互兼容,S锁与X锁,还有X锁与X锁之间都是互斥的。

一致性读取

这种读取方式也称为快照读,是一种无锁的读取方式,主要就是在MVCC机制中运用的。不会给任何记录加锁,是通过版本来控制同一个事务中多次读取的数据保持一致。详细可以回到上面看看。

锁定读

又叫做当前读,实现方式主要是为相关的记录加上对应的锁,防止其他事务的影响。 而加的锁又有两种类型,一种可以加S锁,lock in share mode,这时候其他事务也可以来读,但是不能写。
另一种是for update,加的是X锁,这时候其他事务不能写,也不能读。如下:

select * from user where id = 1 for update; 读写锁,排他锁
select * from user where id = 1 lock in share mode; 读锁,共享

写操作

写操作的时候,又分为删除,修改,添加三种方式。

  • delete删除的时候,在数据库中底层的逻辑其实是将这个数据给隐式删除,只要当前查询不出来就可以了。所以这时候加的就是一个X锁。
  • update修改的时候,又分为两种情况,一种是修改原数据记录,这时候加上一个X锁就行了。另一种是可能把这个原数据id之类的涉及到存储位置变动的操作,那先定位到数据加上X锁,然后将数据和锁都删除。再插入条新数据就可以了
  • insert插入操作的时候,并不会显式的加锁,会有一种叫做隐式锁的机制来处理,我们后面细说。

表锁

上面我们说的这些锁操作,默认都是加在记录上的。其实我们也可以直接给表加上S锁或者X锁。

这时候问题就来了,这里的S锁和X锁的兼容性是没变的,依旧是 只有S锁和S锁可以相互兼容,S锁与X锁,还有X锁与X锁之间都是互斥的。

  • 当表中某些数据存在S锁的时候,是不能加X锁的。
  • 表中某些数据存在X锁,也是不能加S锁和X锁的。

但是,加表锁的时候,难道要扒拉一遍表中所有数据,看看都有没有加锁吗? 不可能的,这辈子都不可能的。

所以这里还有一个表级意向锁的概念,每当有事务给某个记录加了锁,就要在表上加上一个意向锁。如果表记录中有S锁,那么表上肯定就有IS表级意向锁;如果表记录中有X锁,那么表上肯定就有IX表级意向锁。

所以当我们想要再表上加锁的时候,要看我们加的锁是不是和记录中的锁互斥,互斥的话就是不能加的。
在这里插入图片描述
其实表的锁有些鸡肋,一般情况下是用不到的。真想使用的时候可以通过这个语句手动添加:
LOCK TABLES t READ : InnoDB 存储引擎会对表 t 加表级别的 S锁 。
LOCK TABLES t WRITE : InnoDB 存储引擎会对表 t 加表级别的 X锁 。

行锁

上面我们已经了解了锁的大部分概念,但是在真正的记录锁/行锁使用中,还是有其他问题要解决的。

在这里插入图片描述
比如现在有这样一批数据,如上图。

想要在8这条记录加上一个锁,无论是加X锁或者S锁都是可以的。加上之后防止其他事务来修改数据。

但是我们已经知道隔离级别有个幻读的问题,为了解决这个问题,mysql还有一个间隙锁的概念。就是在记录与记录之间加一个间隙锁。防止当前事务处理期间,在这些数据中插入新的记录。注意,间隙锁只会加在记录的前面。 也就是说,想要给8这个数据加间隙锁的时候,默认是加在记录3和记录8之间。这时候就有个问题了,第一条还可以,那最后一条怎么加间隙锁? 也是有办法的。

还记得之前讲页面数据结构的时候,记录是一个链表,链表的尾部会固定的指向数据页固定的一个最大记录,这个最大记录是假的。数据页出现的时候就存在,就是用来定位记录链表的最后一条数据。那么往最后一条记录加间隙锁的时候,就可以在那条(伪)最大记录上加就可以了。

如果锁住某条记录,并且顺便把间隙锁加上的这种操作,官方称为next-key锁

当其他事务想要在这些记录中间插入数据的时候,会先判断该位置是否有间隙锁。如果存在间隙锁的话,就获取锁失败,陷入等待状态。一直等到前面的事务释放了这个锁,会唤醒等待的事务线程来竞争锁。
在这里插入图片描述
action:这里的锁是如何竞争,前一个事务如何唤醒后面的事务,没有找到这方面相关资料。

隐式锁

上面提过这个概念,就是在新插入一条记录的时候,并不会主动加上锁。还记得我们在MVCC机制中介绍的时候,每条记录都有一个最后修改事务id的隐藏列吗?

如果后来的事务想要给这条新记录加锁的时候,会先查看一下这个记录的最后修改id是否还在活跃中。如果还在活跃,证明当前还未提交。就主动给当前活跃的这个事务加锁,再给自己加一个等待锁。这就是一种隐式锁的概念。

死锁

如果有这样两个事务A、B,他们分别都要执行不相关的两批数据,1、2和a。但是执行执行顺序不同。A先在1、2两条记录加了锁,B先在a记录加了锁。等双方想去获取剩余记录锁的时候,发现已经被占用了,于是都在等待对方释放锁。这就造成了死锁的问题。

InnoDB会检测这种循环等待释放的死锁问题,如果检测到两个事务因为这种问题陷入了死锁,超过一定时间,InnoDB引擎会把修改记录比较少的那个事务先给回滚了,避免一直死锁。这是一种相对来说比较优的解决方式。

这说的是引擎查询导致的死锁问题,还有一种是我们分布式数据加悲观锁处理导致的死锁问题,可以改为乐观锁+版本号的操作,这里就先不展开讲了。

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

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

相关文章

【MySQL进阶之路 | 高级篇】MVCC三剑客:隐藏字段,Undo Log,ReadView

1. 再谈隔离级别 我们知道事务有四个隔离级别,可能存在三种并发问题: 在MySQL中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,如果仅从定义的角度来看,它并不能解决幻读问题。如果我们想要解…

2024年jupyter notebook如何复制单元格cell输出的图片

背景 之前使用jupyter notebook复制图片一直是正常,右键就行,可以找到复制图片或者另存为的选项。 但是最近重新安装了anaconda,发现jupyter notebook升级了,和原来的界面不一样了。 如果有一个图片,我们右键&#x…

【Linux】—管理、设置防火墙规则(firewalld详解)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

[OJ]平均串问题,存在超时问题未解决

众所周知,两个数a和b的平均数计算公式为(ab)/2。 实际上平均数也可以描述为:从较小的数依次遍历到较大的数,将遍历的数放入一个列表中,该列表的中心元素。例如:求 3和7的平均数,列表为{3,4,5,6,7}&#xff…

2024-06学习笔记

1.事务与数据库链接的占用 如果用Transactional注解,那在第一次与数据库交互的时候,就会打开数据库链接,再整个方法执行完,才会关闭数据库链接。 即使后边用的事务传播是required_new,那之前的事务也是被挂起,不会被…

静态路由学习笔记

1. 静态路由应用场景 (1)静态路由由网络管理员手动配置,配置方便,对系统要求低,适用于拓扑结构简单并且稳定的小型网络。 (2)缺点是不能自动适应网络拓扑的变化,需要人工干预过多。…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候,开始的时候选择Manually select features,于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行: npm install axios -S 之后再在需要发送请求的view导入即可。 router…

研发(RD)注意事项 / 复杂项目规划、控制方法 PERT 和 CPM

注:机翻,未校对,去掉了原文中广告。 What Is Research and Development (R&D)? 什么是研发(R&D)? Investopedia / Ellen Lindner Research and Development An ongoing effort to develop or impr…

springboot中使用knife4j访问接口文档的一系列问题

springboot中使用knife4j访问接口文档的一系列问题 1.个人介绍 🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的…

Hive3:Centos7环境部署Hive服务

一、安装说明 1、Hadoop集群情况 3台机器:4G2C、2G2C、2G2C 安装教程:Centos7环境安装Hadoop集群 2、安装MySQL,用于存储Hive的元数据 在102机器上安装MySQL 安装MySQL使用服务器的root账号 3、最后安装Hive 安装hive过程使用服务器的atgu…

【C++】选择结构案例-三目运算符

三目运算符语法格式: 布尔表达式?表达式1:表达式2 运算过程:如果布尔表达式的值为 true ,则返回 表达式1 的值,否则返回 表达式2 的值 (三目运算符指的是?和:) 在这个三目运算符…

postman请求响应加解密

部分接口,需要请求加密后,在发动到后端。同时后端返回的响应内容,也是经过了加密。此时,我们先和开发获取到对应的【密钥】,然后在postman的预执行、后执行加入js脚本对明文请求进行加密,然后在发送请求&am…

【游戏制作】使用Python创建一个完整的2048游戏项目

目录 项目运行展示 项目概述 项目目标 项目结构 安装依赖 代码实现 1. 导入库 2. 创建 Game2048 类 3. 设置UI界面 4. 加载二维码图片 5. 创建菜单 6. 游戏逻辑和功能 7. 运行应用 总结 创建一个完整的2048游戏项目 项目运行展示 项目概述 在这个项目中&#xff…

Mysql中如何实现两列的值互换?给你提供些思路。

文章目录 Mysql中如何实现两列的值互换1、第一感觉此sql应该能处理问题了2、需要一个地方存要替换的值,不然两列搞不定。2.1 加第三列?(能解决,但是看起来呆呆)2.2 上临时表(搞点弯路走走) 示例…

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证,后端依然也需要进行验证,以防不合规的数据直接进入服务器,如果不对其进行拦截,严重的甚至会造成系统直接崩溃! 本文结合…

昇思25天学习打卡营第24天|RNN实现情感分类

RNN实现情感分类学习总结 概述 情感分类是自然语言处理领域的重要任务,主要用于识别文本中表达的情绪。本文使用MindSpore框架实现基于RNN的情感分类模型,示例包括: 输入: “This film is terrible” -> 标签: Negative输入: “This fi…

UE5.4内容示例(1)- 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例,可以用此示例熟悉一遍UE5的功能 模型与材质部分 StaticMeshes FBX_Import_Options Material_Advanced Material_Decals Material_Instances Material_N…

Python 高阶语法

前言: 我们通过上篇文章学习了Python的基础语法,接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性:  封装  继承 …

Zilliz 推出 Spark Connector:简化非结构化数据处理流程

随着人工智能(AI)和深度学习(Deep Learning)技术的高速发展,使用神经网络模型将数据转化为 Embedding 向量 已成为处理非结构化数据并实现语义检索的首选方法,广泛应用于搜索、推荐系统等 AI 业务中。 以生…

用护眼灯还需要开灯吗?护眼灯行业三大套路迷局揭秘

用护眼灯还需要开灯吗?在使用护眼台灯时,同时开启室内的主照明十分必要。如果关闭其他灯具,仅保留护眼台灯,那么只有台灯周围的小片区域能够被照亮,而房间的其他部分则处于相对昏暗的状态。这种明显的光线差异会造成视…