mysql “可重复读“ 解决了哪些问题,没有解决哪些问题?

article/2025/9/28 11:58:44

可重复读解决了更新带来的不可重复读问题,但是没有解决插入或者删除带来的幻读问题。这句话,是老八股文了。
但真实情况是这样的吗?这个验证不麻烦,我们可以动手来验证一下。
我使用的是免安装版本的windows mysql8.0.31,用power shell登录mysql客户端,命令行操作mysql。
搞一个测试表user1,里面有一条初始化数据,如下:
在这里插入图片描述
看一下mysql默认的隔离级别
select @@transaction_isolation;
在这里插入图片描述
可以看到mysql的默认隔离级别就是可重复读,我们不用修改。
下面开始操作。
1、事务A,执行begin,然后执行update语句,将name由"张三"改成"李四",此时先别提交。
在这里插入图片描述
2、事务B,执行begin,然后执行select语句,此时也别提交。
在这里插入图片描述
事务B为什么要执行一个select语句?
其实是,如果我们只是执行一个begin命令,此时mysql不会产生事务。
在这里插入图片描述
需要执行一个命令才会有事务,不一定是select,其他语句也可以。
在这里插入图片描述
然后事务A的update语句提交,如下图。可以看到,事务A提交后,再次查询id=1的数据,name已经由"张三"变成了"李四"
在这里插入图片描述
我们再看一下事务B的窗口,执行一下select。
在这里插入图片描述
可以看到,id=1的name字段还是"张三",并没有发生变化。
至此,我们就验证了:“可重复读” 隔离级别下,确实可以解决更新语句带来的 “不可重复读” 问题。
那是否解决了幻读呢?
我们在事务A插入一条语句,提交。
在这里插入图片描述
在事务A可以看到,新增了一条数据,id=2,name=“王五”
按照八股文的说法,我们此时在事务B执行select,应该是可以看到新增的这条id=2的数据的。
我们验证一下,在事务B上执行查询。
在这里插入图片描述
并没有看到新增的数据!
嗯?难道mysql的"可重复读"隔离级别解决了幻读问题吗?
如果是这样,那Serializable隔离级别就没啥意义了吧?
实际上,mysql的"可重复读"隔离级别解决了select的幻读问题,没有解决update、insert、delete的幻读问题,怎么理解呢?
我们举个例子。
事务A再执行一个语句,插入一个id=3,name="李四"的数据,
insert into user1 (id,name) values (3,“李四”);
执行完,提交。可以看到新增成功。
在这里插入图片描述
回到事务B,执行一个更新语句,将表中name字段为"李四"的数据都改成aaaaaa
update user1 set name = “aaaaaa” where name = “李四”;
如果可重复读能解决更新语句带来的幻读问题,我们看到的结果应该是:

idname
1aaaaaa
2王五

但实际上,是这样的

idname
1aaaaaa
2王五
3aaaaaa

这说明,事务B读到了事务提交的insert语句,然后将其name字段改为了aaaaaa,所以"可重复读"隔离级别并没有解决insert的幻读问题,同理update、delete也是一样的。
那是什么原因导致的以上情况呢?
这里面涉及到两个概念,快照读、当前读。
先说快照读。
在事务A开启事务,未提交事务时,事务B开启了事务,执行了查询操作,此时事务B读取的就是数据库的一个快照。事务A此时操作数据提交,影响不到事务B的读操作,因为MVCC的缘故。MVCC其实就是借助版本号,结合undo日志实现,有时间再写一下这个,此处按下不表。
但是事务B如果执行update、delete、insert,这就不是快照读了,而是当前读,读取的是表最新的数据。类似于select …for update操作。
如果事务B执行select操作,并且想读到最新的数据。有2个方法。
一个是加select+for update,执行当前读。
另一个就是等待事务A提交后,再开启读事务。
除此之外,我们还可以上更高的隔离级别:serializable级别,也就是串行化。这个级别是怎么解决以上问题的呢?
事务A开启事务执行insert语句。
在这里插入图片描述
事务B开启事务执行select语句,如下图:
在这里插入图片描述
可以看到,select直接卡住,然后等待锁超时了,也就是说在serializable级别下,写请求没有提交时,不允许开启其他事务。
参考:
1、https://dev.to/techschoolguru/understand-isolation-levels-read-phenomena-in-mysql-postgres-c2e
2、https://blog.csdn.net/qq_43295093/article/details/120561978


http://chatgpt.dhexx.cn/article/jxWVB5Xy.shtml

相关文章

透彻解读mysql的可重复读、幻读及实现原理

目录 一、事务的隔离级别 二、mysql怎么实现的可重复读 举例说明MVCC的实现 MVCC逻辑流程-插入 MVCC逻辑流程-删除 MVCC逻辑流程-修改 MVCC逻辑流程-查询 三、幻读 快照读和当前读 四、如何解决幻读 事务隔离级别有四种,mysql默认使用的是可重复读&#x…

前端开发:a标签实现下载功能

应用背景 前端项目实现下载文件的功能,在后台没给我们撸接口的情况下,我们可以利用a标签实现下载功能,而且贼简单~ 实现原理 通过a标签的download的属性,将需要下载的文件放在前端项目中,然后href属性访问文件路径&a…

a标签/js下载文件(2020)

a标签/js 下载服务器文件 一、二进制式下载1、responseType(请求)2、Content-Type(响应)判断是普通数据还是文件流(可选)3、Content-Disposition(响应)和文件名(可选&…

a标签下载pdf文件

通过a标签的download属性可以实现下载pdf文件,不过有一个弊端:网站和pdf文件必须在同一域名下才可行,不然就是先打开一个新标签预览,然后点击下载按钮进行下载。

a标签实现文件下载功能

文件下载原理: java后台只能做到返回二进制流或文件给前端,最终在前端页面创建一个a,然后触发a的点击事件实现点击下载效果。 1.无需token的 2.请求头需要token 接口: 点击事件:

前端-基于a标签实现下载功能

最近在一个项目中需要实现下载功能,在前期与后端多次联调尝试使用接口下载文件无果后,最后抱着试一试的心态使用了A标签下载,方法是有效的,但是有部分局限性!!! 使用a标签实现下载的步骤如下&am…

a标签的download属性(荐)

在html 中 a 链接有 download 这样一个属性 它有什么用呢?! 我们在页面中提供下载的时候,都需要去配置一些服务端的东西,比如指定 zip 文件就通知浏览器下载这个文件。 但是,比如 .jpg 这样的图片文件,如…

html a标签下载文件

<a href"/user/test/xxxx.txt" download"文件名.txt">点击下载</a>

前端a标签实现文件下载

a标签实现文件下载 如果想通过纯前端技术实现文件下载&#xff0c; 下载的静态文件放项目路径下&#xff0c;A标签下载&#xff0c;herf指定项目路径&#xff0c;加上download属性。a链接默认的是在同一页面打开&#xff0c;如果我们需要打开新的页面&#xff0c;就需要添加t…

html利用a标签实现下载本地的文件

在写html页面的时候&#xff0c;需要在网页上提供一个下载按钮可以下载我自己电脑中的文件。我已经知道了该文件的路径&#xff0c;但是之前看了很多文章都没找到正确办法&#xff0c;一直不知道如何能够下载本地的文件&#xff0c;经过不断实验发现&#xff0c;可以利用a标签中…

一、<a>标签如何实现下载

实习期间负责的第一个项目&#xff1a;广东互联网协会官网。其中有一个很常见的功能----点击下载。 页面截图 在此之前&#xff0c;我所认识的<a>标签只是用于页面跳转的&#xff0c;实现文件下载是如何做到的呢&#xff1f; 答案是&#xff1a;使用href与download属性 …

面试官:如何用a标签实现文件下载?(一文带你手撕知识点)

前言 大家好&#xff0c;今天给大家带来前端小知识&#xff1a;前端利用a标签实现文件&#xff08;图片&#xff09;下载&#xff0c;也就是教大家利用a标签或者是 window.open() 来实现下载功能。 文章目录 前言常用方式方法分析代码实现 常用方式 <a href"url"…

Jquery之遍历元素

J q u e r y Jquery Jquery之遍历元素 使用 e a c h ( ) each() each()方法传入函数两个参数分别为 i n d e x , d o m index,dom index,dom对象。 <body><div>1</div><div>2</div><div>3</div> </body> <script src&quo…

jQuery 遍历数据

在jQuery 中&#xff0c; $.each( )方法主要用于遍历数据&#xff0c;通过该方法&#xff0c;我们可以遍历任何一个对象&#xff0c;比如数组和对象。 语法格式&#xff1a; $.each(object,function(index,ele))示例&#xff1a; &#xff08;1&#xff09;遍历数组的数据 …

jQuery - 元素遍历

前言&#xff1a; 一提到“遍历”,大家一般都能联想到 each() 或者 for()等语法&#xff0c;但是在jQuery中究竟什么是遍历&#xff1f; 什么是遍历&#xff1a; jQuery 遍历&#xff0c;意为"移动"&#xff0c;用于根据其相对于其他元素的关系来"查找&qu…

Jquery-节点遍历4种方法

节点遍历 遍历子元素 遍历同辈元素 遍历前辈元素 其他遍历方法 遍历子元素 children()方法可以用来获取元素的所有子元素 $(selector).children([expr]); 获取<section>的子元素&#xff0c;但不包含子元素的子元素 var $section $("section").childr…

jq遍历元素

jq遍历元素 通过jq遍历元素、并控制一些元素的属性&#xff08;显示/隐藏、value、src等等&#xff09;&#xff0c;是我们在开发之中比较常见的操作&#xff0c;也为我们的业务功能扩宽了方向&#xff0c;接下来我将结合近段时间在工作上的际遇粗略介绍一下一些稍稍复杂的jq遍…

JS 遍历

目录 1. for 数组遍历2. for ... of3. forEach( )4. some( )5. every( )6. filter( )7. map( )8. find( )9. findIndex( )10. reduce( )11. reduceRight( ) 对象遍历1. for ... in2. Object.keys( )3. Object.values( )4. Object.entries( )5. Object.getOwnPropertyNames( ) 1…

数据库——数据字典

数据库——数据字典是什么&#xff1f; 一.数据字典以及使用场景&#xff1a; User表&#xff0c;User主体有很多属性&#xff0c;比如证件&#xff08;身份证、居住证、港澳通行证…&#xff09;地区&#xff08;河北、河南、北京…&#xff09;等&#xff0c;然后表建好了&…

数据库设计--数据字典

数据字典定义 数据字典&#xff08;data dictionary&#xff09;是对于数据模型中的数据对象或者项目的描述的集合&#xff0c;这样做有利于程序员和其他需要参考的人。分析一个用户交换的对象系统的第一步就是去辨别每一个对象&#xff0c;以及它与其他对象之间的关系。这个过…