MySQL可重复读应用场景_mysql-repeatable read 可重复读隔离级别-幻读实例场景

article/2025/9/28 10:24:07

本文详解 repeatable read 可重复读 隔离级别产生的影响(幻读)

-- SERIALIZABLE serializable 序列化 ;一个个事务排成序列的形式。事务一个挨一个执行,等待前一个事务执行完,后面的事务才可以顺序执行

-- REPEATEABLE READ repeatable read 可重复读;安全上不如serializable,但是性能上比serializable强很多,但会造成幻读。隔离级别:导致幻读,同时开启两个事务,事务A和事务B,当事务A修改了数据,并且提交了,事务B此时查看不到事务A已经提交了的数据,这样保持事务B先后两次查询结果的一致性,当事务B执行update操作的时候,是可以更改事务A提交了的update,insert数据,执行过update操作之后再次select发现数据前后查询不一致!(幻读)

-- READ COMMITED read committed 提交的可读;(oracle默认)

-- READ UNCOMMITED read uncommitted 未提交的可读;(mysql 默认)别的事务可以查看的到使用 当前事务还没提交的 数据;会 脏读,幻读,不可重复读。

-- 幻读:一个事务的查询中查询两次数据,数据不一致!同时开启事务A,事务B。事务A查询一张表中的数据后,事务B修改update了事务A查询的表并做了提交,事务A再次查询这张表,发现数据的不一致!

首先说明:mysql的innodb存储引擎默认的隔离级别就是 repeatable read 可重复读

1.首先开启两个mysql连接,分别开启两个事务A,事务B;两个事务分别查询 software 表的数据,此时数据显示一致的。

1)事务A

b1999fa69167bb61dabfbeed871f55f3.png

2)事务B

a747d01a6964e1011d5e07d5afaef098.png

3)事务A此时修改了sid = 4 的version ,select 可以查看当前修改的结果,但是还没有提交commit!

f724e22520384c7cde2bd12ae556ec2e.png

4)事务B select * from software;查看software是否有修改,发现没有被修改!

08b214efc7d4368c1ec8223d04d2a1f6.png

5)事务A,做commit提交;并查看select * from software;

7461d3956ab61e9a6deb1e22cce6a82b.png

6)事务B,在 5)中事务A做了提交之后,事务B此时是查看不到 事务A对 sid = 4 的version做出的修改的!

6536fa5001f937fa295f371ddb603b2b.png

7)事务B,执行update software set version = version + 1; 并执行select * from software; 查看,发现出现了幻读。

sid = 4 的 version 是在事务A提交后的结果 version = 44 上进行了 + 1 的操作!

611e3e5bcfef68cd060ac795fcfe7cfe.png

总结:幻读的实现场景:事务B先后查询software表出现的结果,与预想的update 后 version+1 的结果出现了不一致。

另外:事务A,事务B同时对software表的同一条记录做修改,后执行的事务可能会执行失败,此时可能会发生行锁的lock情况,执行不成功。后执行的事务必须等待先执行的事务先commit或者rollback,才能对这同一条要修改的记录作出修改;

如:事务A与事务B同时开启,事务A先对sid = 4 的version做修改update。事务B再修改sid的version

1>事务A,此时事务A还没有作出提交commit。

7dc1997b9d24c24036f4666ff9fbd4eb.png

2>事务B 报错ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

发生了行锁,sid= 4 的记录被事务A锁住了,等待事务A作出提交commit或rollback超时。

98af04cd63e0fec9bf033cf8fa794000.png

3>当事务A作出了commit之后,事务B在执行update如下,就可以成功update了

e704cc0cdd241af87f99b8b7c4e2d342.png


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

相关文章

MySQL可重复读级别能够解决幻读吗

引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读,我发现在可重复读的隔离级别下没有出现&…

mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的。 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实不是没做,是可能做…

mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中执行一个update 语句更新一…

可重复读实现原理

不可重复读:事务A多次读取同一个数据,事务B在事务A多次读取的过程中,对数据作了更新,导致事务A多次读取同一个数据时,结果不一致。(比如修改行数据) 幻读:事务A 按照一定条件进行数据…

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

可重复读解决了更新带来的不可重复读问题,但是没有解决插入或者删除带来的幻读问题。这句话,是老八股文了。 但真实情况是这样的吗?这个验证不麻烦,我们可以动手来验证一下。 我使用的是免安装版本的windows mysql8.0.31&#xff…

透彻解读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…