【MySQL面试高频误区】不可重复读和幻读到底有哪些区别?

news2024/11/24 5:28:44

欢迎关注公众号 【11来了】 ,持续 MyBatis 源码系列内容!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

不可重复读和幻读到底有哪些区别?

接下来聊聊 MySQL 中的脏读、不可重复读、幻读问题,重点讲清楚不可重复读和幻读之间的差别,以及 MySQL 如何解决幻读问题

脏读

  • 说明: 脏读即事务 A 读取到了事务 B 已经修改但是没有提交的数据,此时如果事务 B 回滚,事务 A 读取的则为脏数据

  • 对应隔离级别:读未提交 隔离级别下会出现脏读问题

不可重复读

  • 说明: 当事务内相同的记录被检索两次,在两次检索的中间,其他的事务新增、修改、删除了该记录,导致两次得到的结果不同。

  • 对应隔离级别:读已提交 隔离级别下会出现不可重复读问题

  • 案例: 比如事务 A 第一次查询表中 id = 1 的用户年龄,查询出来为 26,此时事务 B 去修改 id = 1 的用户年龄为 27,那么事务 A 再次查询,发现年龄为 27,这就是不可重复读

事务 A事务 B
begin;
select age from user where id = 1; return 26;begin;
update user set age = 27 where id = 1; commit;
select age from user where id = 1; return 27;
commit;

幻读

  • 说明: 在事务 A 执行时,事务 B 新增加了记录,事务 A 读取到了事务 B 新增加的记录

  • 对应隔离级别:可重复读 隔离级别下会出现幻读问题,幻读是不可重复读的一种特殊情况

不可重复读和幻读的区别
  • 不可重复读是事务 A 针对相同记录的两次查询结果不同,因此发生不可重复读是因为在事务 A 执行的过程中,事务 B 去 新增、修改、删除 了事务 A 读取的数据
  • 幻读是事务 A 读取到了事务 B 新 新增 的数据,幻读是不可重复读中的一种特殊情况

在可重复读隔离级别下,解决了不可重复读的问题,但是还是会有幻读问题的存在

数据库标准

上边说的脏读、不可重复读、幻读都是数据库标准下,各个具体的数据库可以自定义的实现对应的事务隔离级别,在 MySQL 中,通过 MVCC 和临键锁可以在可重复读隔离级别下解决幻读的问题,接下来说一下 MySQL 如何解决幻读问题

MySQL 的查询操作分为了两种,在这两种查询操作中会通过 MVCC 和临键锁来解决幻读问题:

  • 快照读:select …
    • 通过 MVCC 解决幻读问题,这种方式在查询时会根据当前的事务 id,只读取在当前事务之前插入的数据,因此不会读取到其他事务新提交的数据,从而造成幻读
  • 当前读:select … for update
    • 通过临键锁解决幻读问题,在查询的数据行之间加锁,来避免其他事务向相关的数据行之间插入数据,从而造成幻读

进阶

至此,MySQL 的幻读问题就得到解决了,掌握了上边的内容也就足以应对面试了,但是在 MySQL 查询的一些极端场景下,还是会出现幻读问题,通过了解这样的极端场景,可以对 MVCC 和临键锁有一个更清晰的认识

如下两种情况:

1、情况 1 中事务 A 先进行查询操作,之后去更新数据,发现可以更新到其他事务新提交的数据

2、情况 2 中事务 A 先进行快照读,之后再进行当前读,发现可以读取到其他事务新提交的数据

这两种情况 本质原因 是更新数据和当前读时,都会去更新版本号,因此在 MVCC 机制下会读取到最新数据(读取到了其他事务新提交的数据),造成幻读

接下来详细介绍一下两种情况造成的幻读现象:

  • 情况1:事务 A 通过更新操作获取最新视图之后,可以读取到事务 B 提交的数据,出现幻读现象

对于下图中的执行顺序,会出现幻读现象,可以看到在事务 A 执行到第 7 行发现查询到了事务 B 新提交的数据了

这里都假设使用的 InnoDB 存储引擎,事务隔离级别默认都是 可重复读

在可重复读隔离级别下,使用了 MVCC 机制,select 操作并不会更新版本号,是快照读(历史版本),执行 insert、update 和 delete 时会更新版本号,是当前读(当前版本),因此在事务 A 执行了第 6 行的 update 操作之后,更新了版本号,读到了 id = 5 这一行数据的最新版本,因此出现了幻读!

(这里的版本号其实就是针对 MVCC 机制中的数据版本链)

image-20241004130706848
  • 情况2:事务 A 在步骤 2 执行的读操作并不会生成间隙锁,因此事务 B 会在事务 A 的查询范围内插入行

对于下边这种情况也会出现幻读,在第 6 行使用 select ... for update 进行查询,这个查询语句是当前读(查询的最新版本),因此查询到了事务 B 新提交的数据,出现了幻读!

1705415928868

那么对于以上两种情况来说,为什么会出现幻读呢?

对于事务 A 出现了幻读,原因就是,事务 A 执行的第 2 行是普通的 select 查询,这个普通的 select 查询是快照读,不会生成临键锁(具体生成临键锁、记录锁还是间隙锁根据 where 条件的不同来选择),因此就 不会锁住这个快照读所覆盖的记录行以及区间

那么事务 B 去执行插入操作,发现并没有生成临键锁,因此直接可以插入成功

重要:那么我们从代码层面尽量去避免幻读问题呢?

上边说的幻读问题其实就是 事务 A 在查询的时候没有查到其他事务提交的数据,但是在修改数据或当前读时,由于更新了版本号,因此可以查询到其他事务提交的数据 ,这种幻读现象可以在事务开启时通过 for update 直接加锁来解决:

  • 通过 for update 加锁来阻塞,避免因为幻读,更新到其他事务提交的数据

在一个事务开始的时候,尽量先去执行 select ... for update,执行这个当前读的操作,会先去生成锁(具体生成记录锁、临键锁还是表锁要根据 where 条件来判断),锁住查询记录的区间,不会让其他事务插入新的数据,因此就不会产生幻读

这里我也画了一张图如下,你也可以去启动两个会话窗口,连接上 mysql 执行一下试试,就可以发现,当事务 A 执行 select ... for update 操作之后,就会加上临键锁(由于 where 后的条件是 id=5,对主键索引进行等值查询,因此给 id=5 这一行的数据添加记录锁),那么事务 B 再去插入 id=5 这条数据,就会因为有锁的存在,阻塞插入语句

1705416690115

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

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

相关文章

zotero使用koofr+google drive/onedrive同步

最早了解到这个思路是来自 知乎-【从零开始使用Zotero】(3) Zotero文献同步方式 和 How to Sync Zotero Files Using WebDAV and Google Drive with Koofr: A Step-by-Step Guide 虽然周围很多人都在用Readpaper这种web端的了,但是经常逛Arxiv而且zotero的web插…

论文翻译 | Language Models are Few-Shot Learners 语言模型是少样本学习者(下)

6 更广泛的影响 语言模型对社会有着广泛的有益应用,包括代码和写作自动补全、语法辅助、游戏叙事生成、提高搜索引擎响应以及回答问题等。但它们也可能有潜在的危害性应用。GPT-3在文本生成质量和适应性方面优于较小的模型,并且增加了区分合成文本与人类…

使用GitLab CI构建持续集成案例

1. 部署GitLab (1)基础准备 解压软件包并导入镜像: [rootmaster ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz [rootmaster ~]# tar -zxvf Gitlab-CI.tar.gz [rootmaster ~]# ctr -n k8s.io image import gitla…

408 笔记错题本

数据结构 树 线索二叉树 组成原理 第五章 计组 SISD 一两个指令和数据 不能采用数据并行技术,但是可以采用流水线技术,计组这门课 就是讨论的是SISD这个概念。 SIMD 应用:浮点机、向量处理机、优化for循环。 MISD 这个理论上是不存在…

考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)

考研论坛平台小程序 目录 基于java和微信小程序的考研论坛平台小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂…

华为资源分享

紫光云文档中心提供弹性计算服务文档https://www.unicloud.com/document/product/ElasticComputeService/index.html报文格式华为报文格式资料Info-Finder(在线工具) 报文格式华为IP网络电子书华为IP网络相关电子书IP网络系列丛书 - 华为企业业务华为产品…

[云] DockerCoins 练习笔记

DockerCoins DockerCoins 由 5 个服务组成 rng (随机数生成器): 这是一个Web服务,它的任务是生成随机字节。随机字节通常用于加密、安全令牌生成、测试等场景。 hasher (哈希计算器): 这个服务接收数据(通常是通过POST请求发送的数据)&#…

202408第十五届蓝桥杯青少组省赛C++中级组题解

202408第十五届蓝桥杯青少组省赛C++中级组题解 单选题 1、定义 char a[]="hello\nworld",执行 cout<<a,输出结果是(B) A、helloworld B、hello world C、 hellonworld D、 hello\nworld 解析:\n输出时会换行。 2、 的结果是(C)。 A、 B、

商城网站建设怎么建

商城网站已经成为企业迅速拓展市场、提升品牌形象的重要利器。随着互联网技术的飞速发展&#xff0c;传统的实体店面已经不能满足消费者多样化的购物需求。因此&#xff0c;搭建一个功能强大、用户友好的商城网站成为企业不可或缺的一环。 首先&#xff0c;商城网站的建设需要具…

OpenCAEPoro安装与测试(ASC 2024)

首先简单总结一下经验&#xff1a; 在之前的测试和学习中&#xff0c;由于自己是虚拟机或者云服务器&#xff0c;有root权限&#xff0c;经常无脑增删文件&#xff08;主要是为了图省事&#xff0c;看见报错就加回来&#xff0c;多出来就删除&#xff09;&#xff0c;但是在经…

D 咖饮品机闪耀荆州动漫嘉年华

在今年的国庆佳节&#xff0c;恰逢金秋时节&#xff0c;荆州动漫嘉年华盛大开幕&#xff0c;这场充满活力与创意的盛会吸引了无数动漫爱好者的目光。而在众多精彩的展示中&#xff0c;D 咖饮品机的出现无疑为这场嘉年华增添了一抹别样的色彩。 走进嘉年华现场&#xff0c;热闹的…

ubuntu18.04运行OpenPCDet出现的问题

一、概述 在编译成功OpenPCDet的源代码之后&#xff0c;发现在运行demo时候&#xff0c;依旧出现了很多问题&#xff0c;在此对出现的问题进行总结记录。 二、问题分析 &#xff08;一&#xff09;ModuleNotFoundError:No module named av2 如图所示 这个问题比较简单&#x…

(C语言贪吃蛇)14.用绝对值方式解决不合理的走位

目录 前言 解决方式 运行效果 总结 前言 我们上节实现了贪吃蛇四方向走位&#xff0c;但是出现了一些不合理的走位&#xff0c;比如说身体节点和头节点重合等等&#xff0c;本节我们便来解决这个问题。 我们希望贪吃蛇撞到自身时游戏会重新开始&#xff0c;并且贪吃蛇的运动方…

TryHackMe 第6天 | Web Fundamentals (一)

这一部分我们要简要介绍以下 Web Hacking 的基本内容&#xff0c;预计分三次博客。 在访问 Web 应用时&#xff0c;浏览器提供了若干个工具来帮助我们发现一些潜在问题和有用的信息。 比如可以查看网站源代码。查看源代码可以 右键 网页&#xff0c;然后选择 查看网站源代码&…

Discord 用户突破2亿:CEO 谈发展规划、产品策略及游戏通信的未来

Discord,这个最初为游戏玩家打造的社区平台,如今已经发展成为一个拥有超过2亿月活跃用户的全球性社交网络。创始人兼CEO Jason Citron在经历了多次创业尝试后,最终将Discord打造成了一个不可或缺的游戏通信工具。以下是Jason Citron在接受GamesBeat采访时,对Discord的现状、…

招联金融2025校招内推

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

MAE(平均绝对误差)和std(标准差)计算中需要注意的问题

一、MAE&#xff08;平均绝对误差&#xff09; 计算公式&#xff1a; yi​ 是第i个实际值y^​i​ 是第i个预测值 计算方法&#xff1a; MAE就是求实际值与预测值之间的误差&#xff0c;需要给出预测值和原始的实际值 二、std&#xff08;标准差&#xff09; 计算公式&#x…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)

如果要搭建基于docker的私人DC&#xff0c;除了虚拟机网络连接外&#xff0c;就得掌握docker的网络连接。磨刀不误砍柴工&#xff0c;或者说工欲善其事必先利其器&#xff0c;我们先学学典型的docker的网络连接方式。Docker的网络连接有四种&#xff1a;bridge、none、containe…

MySQL【知识改变命运】01

库的基本操作语法 1:SQL的简介2:SQL的基本分类3:库的基本操作1&#xff1a;查看库2&#xff1a;创建数据库1:创建一个diayang库2&#xff1a; ⾃定义⼀个数据库名&#xff0c;如果数据库不存则创建&#xff0c;3&#xff1a;查看警告信息4&#xff1a;字符集编码和校验(排序)规…

从零开始讲PCIe(4)——PCI总线的地址空间分配

一、概述 PCI架构支持三种地址空间&#xff0c;如图1-10所示&#xff1a;内存地址空间&#xff08;Memory Map&#xff09;、I/O地址空间(I/O Map)和配置地址空间&#xff08;PCI Configure Space&#xff09;。在x86处理器中&#xff0c;处理器可以直接访问内存和I/O空间。PCI…