!何为脏读、不可重复读、幻读
2.0、前言
事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰的特性,隔离性是事务ACID特性中的I,根据隔离程度从低到高分为Read Uncommitted(读未提交),Read Committed(读已提交),Repeatable Read(可重复读),Serializable(串行化)四种隔离级别。在具体介绍事务隔离性前先介绍几个名词,以便说明数据库在并发操作时候可能存在的问题,以便展开来探讨这四种隔离级别对应存在哪些问题,哪些隔离级别解决了哪些问题。
2.1 何为脏读、不可重复读、幻读
脏读
所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,如下图:
image.png
如上图开启两个会话来模拟两个线程同时去访问数据库表table中id=1的记录,假设两个会话开启前数据库中table表中id=1的记录行里面的列age值为5。会话1和2一开始都开启了显示的事务(只有执行commit命令才会提交数据的修改),会话2首先更新了table中id=1的记录行的age列的值为10(更新前值为5),在会话2执行commit提交前,会话1通过select语句查询id=1的记录行中age列的值,这时候如果存在脏读,则会话1读取到的age的值是10而不是5了,虽然会话2的更新还没有提交。那么脏读存在什么问题那?如果会话2最后提交了,那么会话1虽然在会话2还没提交就读取到了修改的值,但是也没什么影响;但是如果会话1读取到会话2没有提交的数据后,会话2执行了rollback,也就是没有把修改刷新到数据库,但是会话1已经使用了修改的数据,这就出现了错误。
不可重复读
所谓不可重复读是指在一个事务内根据同一个条件对行记录进行多次查询,但是搜出来的结果却不一致。发生不可重复读的原因是在多次搜索期间查询条件覆盖的数据被其他事务修改了,下面借助图表来解析下不可重复读。image.png
如上图假设数据库表table里面id=1的记录行中age列一开始值为5,然后会话1和会话2分别开启了一个事务,会话1首先查询id=1的记录中age字段值为5,然后会话2修改id=1的记录中age的值为10然后提交了事务,然后会话1再次搜出id=1的记录中age的值,如果出现了不可重复读,则这时候搜出来的age的值为10而不是5。需要注意的是会话1两次查询是在同一个事务内进行的,期间事务并没有提交。不可重复读的存在显得不是那么不可容忍,毕竟读取的是已经提交了的数据。
幻读
所谓幻读是指同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录)。比如同一个事务A内第一次查询时候有n条记录,但是第二次同等条件下查询却又n+1条记录,这就好像产生了幻觉,为啥两次结果不一样那。其实和不可重复读一样,发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据。不同在于不可重复读是同一个记录的数据内容被修改了,幻读是数据行记录变多了或者少了:image.png
如上图假设表table里面一开始有一个id=3的记录,会话1首先开启了一个事务,然后查找id>2的记录,会发现结果只有一个记录,然后会话2开启事务插入了id=5的一个记录,然后提交。这时候会话1再次查找id>2的记录,如果存在幻读,则这时候会话1会看到两条记录。
注:脏读是指一个事务读取到了其他事务没有提交的数据,不可重复读是指一个事务内多次根据同一个查询条件查询出来的同一行记录的值不一样,幻读是指一个事务内多次根据同个条件查出来的记录行数不一样。为了解决事务并发带来的问题,才有了事务规范中的四个事务隔离级别,不同隔离级别对上面问题部分或者全部做了避免。
最后
更多Spring事务传播性与事务隔离性的咨询可以单击我
想了解更多关于粘包半包问题单击我
更多关于分布式系统中服务降级策略的知识可以单击 单击我
想系统学dubbo的单击我
想学并发的童鞋可以 单击我
作者:阿里加多
链接:https://www.jianshu.com/p/f7ac1b22e899
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
!何为脏读、不可重复读、幻读相关推荐
- mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解
一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...
- 脏读,不可重复读,幻读区别
脏读 脏读又称无效数据读出.一个事务读取另外一个事务还没有提交的数据叫脏读. 例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Roll ...
- oracle 脏读,脏读 不可重复读 幻读
序言 脏读.不可重复读.幻读这几个概念开始接触和学习的时候是在大学学习数据库系统的时候,那时候对这几个专业名词的理解停留在概念文字上,并没有真正使用过实践中,最近工作中涉及到这几个概念方面的知识,就来 ...
- mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...
MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...
- 脏读,不可重复读,幻读区别和避免
在了解脏读,不可重复度,幻读之前,首先要明白这三种情况的出现都是和数据库并发事务有关联的,如果所有的读写都按照队列的形式进行,就不会出现问题. 名词解析和解决方案 脏读 脏读又称无效数据读出(读出了脏 ...
- Mysql如何实现隔离级别 - 可重复读和读提交 源码分析
Abstract 本文会(1) 演示Mysql的两种隔离级别. (2) 跟着mysql的源代码来看看它是怎么实现这两种隔离级别的. Mysql的隔离级别 当有多个事务并发执行时, 我们需要考虑他们之 ...
- MySQL可重复读和读已提交实现原理,深入理解MVCC。
1.隔离级别 MySQL中隔离级别分为4种,提未交读.读已提交.可重复读.串行化.同时MySQL默认隔离级别为可重复读. 图片 查看MySQL隔离级别 SELECT @@tx_isolation 设置 ...
- 三分钟了解MVCC(InnoDB如何实现可重复读和读已提交)
快照读和当前读 快照读 快照读是指读取数据时不是读取最新版本的数据,而是基于历史版本读取的一个快照信息(mysql读取undo log历史版本) , 快照读可以使普通的SELECT 读取数据时不用对表 ...
- mysql 可重复读和读提交的区别
事务的四种隔离级别 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据.Oracl ...
- 脏读、重复读、幻读;
脏读 所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,如下图: 如果会话 2 更新 age 为 10,但是在 commit 之前,会话 1 希望得到 age,那么会获得的值就是更新前的值.或者 ...
最新文章
- 14.关于原子性的相关介绍
- 基于相似学习的目标跟踪方法
- mysql超大表处理方式是_第29问:MySQL 的复制心跳说它不想跳了
- php数组无限文类,php把无限级分类生成数组的类
- Linux下 sshd服务不能启动
- 李楠自曝已预定5.4寸iPhone 12 mini:Pro版还得等一个月
- php 检测函数是否为对象,php如何查看对象方法
- 第五章 ---- 面向对象(二)
- js常用内建对象之:Date
- Git异常:fatal: V1.0 cannot be resolved to branch.
- Spring框架 初步入门猜想
- vue项目中用Iconfont阿里巴巴矢量图标库解析失败的解决办法
- macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16
- 【FPGA频率计】基于FPGA的数字频率计开发,VHDL编程实现
- 钢铁侠java_现代版“钢铁侠”,无所不能的程序员,java工程师实现人造器官!...
- Modeling Conversation Structure and Temporal Dynamics for Jointly Predicting Rumor Stance and Veraci
- 湖北移动B863AV3.1-M2_S905L3A_UWE5621DS_安卓9语音线刷包--支持语音-首页正常-设置不要密码-灯正
- ensp使用web登录防火墙
- 生僻字用计算机怎么弹歌曲,抖音生僻字简谱:计算器数字乐谱计算器弹奏音乐总结...
- 一个计算机毕业生的求职经验
热门文章
- angularJS中,怎么阻止事件冒泡
- ▲数据结构 笛卡尔树【2011】五2 C++版
- php开发客服系统(持久连接+轮询+反向ajax)
- JVM JRE JDK,这些东西到底是什么?(转载)
- 计算机表格最高分,excel表格里怎样算最高分
- python语言key_Python语言学习:字典常用的方法
- maven pc配置要求_《使命召唤:黑色行动5》公开测试PC配置要求:推荐GTX970+i7
- python wait_Python的等效Java函数wait(),notify(),synchronized
- ubuntu安装php5-mysql_Ubuntu下安装Apache2, php5 mysql
- 987C. Three displays