MySQL数据库的脏读、不可重复读、幻读问题

面试官:脏读,不可重复读,幻读是如何发生的? 介绍 数据库事务的四大特性 原子性(Atomic) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) √ 为会发生,×为不会发生 隔离性 脏读 不可重复读 幻读 read uncommitted(未提交读) √ √ √ read committed(提交读) × √ √ repeatable read(可重复读) × × √ ... 阅读详情

准备

先在数据库种执行select @@tx_isolation命令查看当前数据库的隔离级别。

MySQL数据库的默认隔离级别是REPEATABLE-READ,隔离级别就是数据库为了解决脏读、不可重复读和幻读问题的。

为了能够演示脏读、不可重复读和幻读,我们要先修改数据库的隔离级别,否则无法成功演示。

MySQL数据库有如上几种隔离级别,先将隔离级别修改为最低的READ UNCOMMITED,在这种隔离级别下,脏读、不可重复读和幻读的问题都会出现。

使用set tx_isolation='READ-UNCOMMITTED';命令修改隔离级别为最低的READ UNCOMMITED读未提交。

并且执行set autocommit=0取消事务的自动提交。

再准备这样一张表:

脏读

脏读的模拟过程:建立两个MySQL会话,分别为T1和T2,先在两个会话中查看account表的内容,都是一致的;接着在T2会话中执行一条UPDATE语句,对表中username为'lisi'的account字段进行了修改,但没有执行commit语句提交事务,这时候在T2会话中查看表的记录,是正确的,但在其他会话T1中查看表的记录已经是修改后的记录,如果这时候我们对这条username为'lisi'的记录进行操作,但恰巧T2会话回滚了刚才的操作,那么T1会话所做的事情都将会失效,因为这是错误的数据,这也就是脏读问题。

脏读:对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后, 若 T2 回滚, T1读取的内容就是临时且无效的。

那么如何解决脏读问题呢?MySQL数据库专门为解决这些问题提出了隔离级别,现在将隔离级别提升到READ COMMITED读取已提交,就能够解决脏读问题了。

执行set tx_isolation='READ-COMMITTED';命令修改隔离级别为READ COMMITED读已提交来解决脏读问题,在修改隔离级别后还需要执行commit;命令,因为刚才已经关闭了事务的自动提交,所以需要手动提交修改。注意:要回滚到'lisi'的account为1000,否则后面不方便查看。

再执行刚才的SQL操作,发现脏读问题已经被解决。

不可重复读

不可重复读模拟过程:在T1和T2会话中查看account表的数据是否为初始状态,然后在T1会话中查看username为'zhangsan'的字段的记录,接着在T2会话中对username为'zhangsan'的字段进行修改并且commit提交事务,再在T1会话中查看username为'zhangsan'的字段的记录,发现它们的account字段的值不一致,这就是发生了不可重复读问题,会造成不良的影响。

不可重复读:有两个事务T1和T2,T1先读取某个字段,然后T2对这个字段进行修改提交后,T1再读这个字段发现值不一样了。

如果要解决不可重复读问题,需要继续提升隔离级别。

执行set tx_isolation='REPEATABLE-READ';命令修改隔离级别为REPEATABLE READ可重复读来解决不可重复读问题,在修改隔离级别后还需要执行commit;命令,因为刚才已经关闭了事务的自动提交,所以需要手动提交修改。注意:要回滚到'lisi'的account为1000,否则后面不方便查看。

再执行刚才的SQL操作,发现脏读问题已经被解决。

只有当在T1会话中commit提交后才能看到已经在T2会话中更新的数据。

幻读

幻读过程模拟:先在1会话中查看记录条数,接着在T2会话中执行插入操作并进行commit提交,最后在T1会话中执行UPDATE操作,本来受影响的行数应该是2行,但实际上却是4行,这就是产生了幻读。

幻读:有两个事务T1和T2,T1先读取表,然后T2在该表中插入一些新行,此时T1再读同一个表,会发现多出来几行。

要解决幻读问题,需要将隔离级别调到SERIALIZABLE,执行set tx_isolation='SERIALIZABLE';命令修改隔离级别为SERIALIZABLE串行化来解决幻读问题,在修改隔离级别后还需要执行commit;命令,因为刚才已经关闭了事务的自动提交,所以需要手动提交修改。注意:要回滚到'lisi'的account为1000,否则后面不方便查看。

再执行刚才的SQL操作,发现脏读问题已经被解决。

只有当T1会话执行commit提交后才能进行操作:

总结

隔离级别就是为了解决脏读、不可重复读、幻读问题的。

隔离级别是否解决脏读是否解决不可重复读是否解决幻读
READ UNCOMMITED×××
READ COMMITED√××
REPEATABLE READ√√×
SERIALIZABLE√√√
【MATLAB代码】基于水声通信(ACOMMS)下的到达时间差(TDOA)定位的AUV自主导航例程,附完整代码 水下AUV导航系统仿真研究 本研究基于到达时间差(TDOA)技术实现了水下自主航行器(AUV)的三维导航仿真系统。系统采用四个声学信标作为定位基准,通过TDOA测量数据迭代求解AUV位置。仿真结果表明: 导航性能:系统能够有效跟踪AUV从起点(30,30,-20)到目标点(70,70,-20)的航行轨迹,定位误差保持在合理范围内。 误差分析:定位误差变化曲线显示系统具有稳定的定位精度,平均误差为0.5米左右。 技术特点:采用两步最小二乘迭代算法求解非线性TDOA方程,提高了定位精度和计算效率。 该仿真系统为 阅读详情

相关推荐

DeepSeek+Coze扣子搭建智能体(保姆级教程)

DeepSeek+Coze扣子搭建智能体(保姆级教程)

yizhen91y的博客 1万+

数据库隔离级别

数据库事务级别 1、未提交读     故名思议 未提交就让别的事务读,容易产生脏读。 是限制级别最低的级别。   比如事务1修改了一行数据,事务2在事务1未提交之前读取了这行数据,如果事务1进行了回滚,那么事务2就读取了一行没有提交的数据,这样的数据是不存在的。所以产生了脏读。 2、提交读 默认的隔离级别,不能读取其他事务未提交的数据,禁止脏读。 比如事务1读取了一行数据,事务

hyylcz4的专栏 686

WRF后处理:python cartopy绘制土地利用/土地分类图//python绘制WRF下垫面类型(以北极为例)

下垫面类型对于WRF的地表过程十分重要,而在我们研究WRF的地表过程之前,需要对输入的土地利用类型进行一些绘制,以便后续的修改。LU_MODIS21函数定义了绘制的土地类型、标签与对应色标,我们使用时,直接引用LU_MODIS21()即可返回。其实很简单,只要将你拥有的土地类型数据提取出来,将原本函数中的labels和C切片,重新定义色标再绘制即可。在这里,我将以北极地区为例,绘制北极地区的WRF下垫面数据,我使用的MODIS21这类。

weixin_43750300的博客 3859

MySQL事务之脏读问题

在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读、丢失更新这四个问题,本篇博客就来为大家讲解 脏读 问题。 脏读 就是一个事务读到另一个事务没有提交的数据。事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,事务B读到的就是脏数据。

小异常的博客 1万+

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 360

基于Simulink的直流电机双闭环调速系统抗扰动仿真与参数优化

本文详细介绍了基于Simulink的直流电机双闭环调速系统仿真与参数优化方法。通过构建转速外环与电流内环的仿真模型,阐述了利用工程设计法整定PI参数的核心步骤,并重点探讨了如何优化系统参数以增强其抗负载突变等扰动的能力,实现快速、平稳的调速性能。

weixin_29061997的博客 193

数据库必备知识:脏读和幻读的定义及应对策略

随着数据库应用的广泛使用,数据库并发性和一致性的问题成为了引起重视的问题之一。其中,脏读(Dirty Read)和幻读(Phantom Read)是常见的并发访问问题,本文将对脏读、幻读进行详细介绍,并结合实际案例说明如何使用并发控制技术来解决这些问题。

Hanko的专栏 3410

i2c转串口驱动移植

i2c转串口驱动移植欢迎使用Markdown编辑器新的改变思路与使用方式合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用M

mars_Vessalius的博客 2276

数据库难点:脏读、幻读、不可重复读与四种隔离级别

前言 本章着重点是介绍:出现脏读、幻读、不可重复读的原因,以及设定四种隔离级别如何解决这些现象,结合图例让读者阅读得更加通透 一、什么是事务? 所谓事务是用户定义的一个数据库序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 在SQL中,定义事务的语句一般有三条: BEGIN TRANSACTION; COMMIT; ROLLBACK; 事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。 COMMIT:表示提交,即提交事务的所有操作 ROLLBACK:

weixin_51201930的博客 1万+

【STM32】从零构建串口IAP框架:BootLoader与App双向跳转实战解析

本文详细解析了STM32串口IAP框架的构建,重点阐述了BootLoader与App双向跳转的实战原理与实现步骤。内容涵盖Flash分区规划、中断向量表重定向、通信协议设计及固件升级流程,并针对跳转失败、程序跑飞等常见问题提供了解决方案,帮助开发者掌握产品级远程升级的核心技术。

wind6的博客 838

YOLOv12涨点改进 | 全网独家首发Conv改进篇 | Arxiv 2025 | 引入一种新的WConv加权卷积改进YOLOv12,显著提升其特征提取能力和目标检测精度

本文提出了一种新型加权卷积(WConv)模块,通过引入最优密度函数动态调整邻域像素权重,显著提升了YOLOv12目标检测性能。WConv在保持参数数量不变的情况下,提高了模型精度(VGG准确率提升10%)、增强了小目标检测能力,并改善了多尺度特征提取。文中详细介绍了模块原理、网络结构改进方法,并提供了核心代码实现和yaml配置文件。实验表明,该方法在图像任务中最高可降低53%的损失,虽然会带来11%的时间开销,但具有优异的鲁棒性。该技术可广泛应用于2D/3D图像处理领域。

Ai缝合怪、助力小伙伴高效发论文 216

MySQL的隔离级别、可能出现的问题(脏读、不可重复读、幻读)及其解决方法

总结了MySQL的隔离级别、可能出现的问题和解决方法。

qq_43472612的博客 1348

[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。这篇文章将继续详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。作者分析该病毒一个月,一方面觉得自己技术菜,另一方面深知系统安全需要坚持,继续加油。希望文章对您有所帮助~

杨秀璋的专栏 1万+

Java-135 深入浅出 MySQL 数据库事务中的四大问题解析:脏读、不可重复读、重复读与幻读

在数据库事务中,常见的问题包括脏读、不可重复读和幻读。脏读是指事务读取到其他事务尚未提交的数据,一旦对方回滚,就会导致数据不一致,常发生在隔离级别为 Read Uncommitted 时。不可重复读则是同一事务内前后两次读取同一记录时,由于其他事务的更新,导致结果不一致,典型出现在 Read Committed 隔离级别下。重复读(Repeatable Read)通过MVCC机制保证同一事务内多次读取结果一致,避免脏读和不可重复读,但仍可能遇到幻读。幻读表现为在同一事务内,两次相同的范围查询返回的行数不一致

谢谢你的喜欢 我们一起无限进步 1196

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Database】动手捣鼓一下MySQL并发问题:脏读、幻读、不可重复读

MySQL脏读、幻读、不可重复读问题演示 建测试表和数据 create table show_me_problem ( id int auto_increment, price int null, location varchar(256) null, constraint show_me_problem_pk primary key (id) ) comment 'mysql并发问题演示表'; insert into show_me_problem values (1,1,'第一条'); i

我想写点儿啥,写点儿啥呢,就写点啥。 769

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

mysql:深度解析数据库隔离问题:脏读、不可重复读与幻读的本质与解决方案

问题类型单机解决方案分布式解决方案监控指标脏读升级到RC级别分布式锁+版本号不可重复读RR隔离+乐观锁Saga事务模式幻读间隙锁+索引优化CDC事件流+物化视图字节跳动内部指标:通过监控锁争用情况,要求锁等待时间<50ms。

weixin_43290370的博客 1196

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

mysql 并发 脏读_MySQL数据库的四种事务隔离级别以及事务的并发问题(脏读/不可重复读/幻读)...

一、事务的四大特性(ACID)1.原子性原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。2.一致性一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何...

weixin_39953244的博客 238

【MySQL数据库】“一篇通过演示带你深刻理解事务的优质好文“(事务特性ACID;并发事务带来的脏读、不可重复读、幻读问题;隔离等级:未提交读、提交读、可重复读、可串行化)

事务是一个不可分割的最小单元,要么全部成功,要么全部失败回滚。不存在部分执行的状态。事务具有ACID特性,本文会对并行事务中的三个问题【脏读、不可重复读、幻读】进行演示,设置隔离等级解决不同的问题。最后在文章末尾给出相关的一些语句。

Stark的博客 817

Mysql数据库-特性,隔离级别,脏读、不可重复读、幻读问题

参考文章 参考文章 特性: ACID: 原子性,一致性,隔离性(4种隔离级别),持久性 隔离级别: 不同事务之间的隔离程度称为隔离级别,主要有以下四种。 AB两个事务 读未提交: B事务可以读到A事务没有提交的数据 读已提交: B事务只能读到A事务已经提交的数据 可重复读: B事务只能读到A事务已经提交的数据,但是同一行的数据读取到的值是不会改变的。比如id为1的字段name值有jack改成了j...

qq_35010942的博客 322

mysql一对多去重复数据库_[MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解与数据库事务隔离级别 - 分析脏读 & 不可重复读 & 幻读...

1. Read UnCommitted(读未提交)最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。2. Read Committed(读提交)大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。3. Repeatable Read(重复读)mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管...

weixin_42498055的博客 185

你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读

关于这四个数据并发问题mysql其实都有解决的方法,这边分为两篇文章去解读,这篇文章主要讲解这四个的概念与代码的实现,下一篇主要讲的是mysql的隔离级别,欢迎大家关注。 什么是脏写? 图片部分部分引用了宋红康老师的课件图片 这个图片的意思就是A会话开启了一个事物,然后B会话也开启了一个事物,B进行了更新名称的操作,A也更新了名称,A提交了事务,b回滚事物,这个结果就是名称啥都没变,这就是脏写 由于mysql的事物隔离级别都解决了脏写的问题,所以我们就没有不能够进行演示了 什么是脏读? AB开.

编码人生 715

【MySQL理论】脏读、不可重复读、幻读

文章目录1. 脏读(dirty read)脏读是指事务读取到其他事务未提交的数据2. 不可重复读(non-repeatable read)不可重复读是指在同一次事务中前后查询不一致的问题3. 幻读(phantom read)幻读是一次事务中前后数据量发生变化,用户产生不可预料的问题4. 总结5. 解决方法 1. 脏读(dirty read) 脏读是指事务读取到其他事务未提交的数据 例如:有事务A、B和一条记录:id为1,name为张三 B首先进行更新操作,将name的值由张三改为张老三,但还未提交事务 be

Hi there 1万+

事务(二):隔离级别以及脏读、不可重复读、幻读

数据库事务的隔离级别: 一、根源——事务并发带来的问题。 二、在数据库事务的隔离级别(五个隔离级别)不同时,数据库中的数据可能会出现以下几种情况:(顺序是对应的隔离级别从低到高) 1、None 不使用事务(一般可省略) 2、Read uncommitted 读未提交(一个事务可以读取另一个未提交事务的数据)       可能出现的问题:脏读、不可重复读、幻读         ——当一个...

Ysunflower的博客 366

数据库脏读、不可重复读、幻读以及对应的隔离级别

数据库脏读、不可重复读、幻读以及对应的隔离级别。并发读取数据出现的问题以及不同的隔离级别。

小小张自由—>张有博 9149

MySQL:MySQL并发事务下的四大问题--脏写、脏读、不可重复读、幻读

MySQL运行时多个事务同时执行是什么场景 引入 我们一般都是通过业务系统去对数据库执行CURD操作的 通常,我们都是在业务系统里开启事务来执行增删改操作的。比如: 也就是说,业务系统是通过执行一个一个的事务,每个事务可能是一个或者多个增删查改的SQL语句。 但是问题是业务一般是多线程的,也就是基于多线程并发对MySQL数据库去执行多个事务的,如下图: 问题:每个事务里面的多个SQL语句都是如何执行的呢? 如下图:从磁盘加载数据页到buffer pool缓存页里去,然后更新buffer poo

OceanStar的博客 5098

事务并发访问问题——脏读、不可重复读、幻读

脏读 不可重复读 幻读

hyment的博客 143
上一篇: 解决“set transaction isolation level read uncommitted;“命令无法修改MySQL数据库隔离级别的问题
下一篇: XML学习笔记
二木成林
博客等级 码龄9年 3472粉丝 1569原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值