【数据库】快速理解脏读、不可重复读、幻读
快速理解脏读、不可重复读、幻读?
理解这三种由于并发访问导致的数据读取问题,再理解事务隔离级别就简单多了。
【1】脏读(读取未提交数据)
A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。
这种情况常发生于转账与取款操作中
时间顺序 |
转账事务 |
取款事务 |
1 |
开始事务 |
|
2 |
开始事务 |
|
3 |
查询账户余额为2000元 |
|
4 |
取款1000元,余额被更改为1000元 |
|
5 |
查询账户余额为1000元(产生脏读) |
|
6 |
取款操作发生未知错误,事务回滚,余额变更为2000元 |
|
7 |
转入2000元,余额被更改为3000元(脏读的1000+2000) |
|
8 |
提交事务 |
|
备注 |
按照正确逻辑,此时账户余额应该为4000元 |
【2】不可重复读(前后多次读取,数据内容不一致)
事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。
时间顺序 |
事务A |
事务B |
1 |
开始事务 |
|
2 |
第一次查询,小明的年龄为20岁 |
|
3 |
开始事务 |
|
4 |
其他操作 |
|
5 |
更改小明的年龄为30岁 |
|
6 |
提交事务 |
|
7 |
第二次查询,小明的年龄为30岁 |
|
备注 |
按照正确逻辑,事务A前后两次读取到的数据应该一致 |
【3】幻读(前后多次读取,数据总量不一致)
事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。
时间顺序 |
事务A |
事务B |
1 |
开始事务 |
|
2 |
第一次查询,数据总量为100条 |
|
3 |
开始事务 |
|
4 |
其他操作 |
|
5 |
新增100条数据 |
|
6 |
提交事务 |
|
7 |
第二次查询,数据总量为200条 |
|
备注 |
按照正确逻辑,事务A前后两次读取到的数据总量应该一致 |
趁热打铁,既然理解了脏读、不可重复读、幻读,那么接下来看看事务隔离级别是怎么个回事【数据库】事务隔离级别
不可
【数据库】快速理解脏读、不可重复读、幻读相关推荐
- 脏读,不可重复读,幻读区别
脏读 脏读又称无效数据读出.一个事务读取另外一个事务还没有提交的数据叫脏读. 例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Roll ...
- mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解
一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...
- mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...
MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...
- oracle 脏读,脏读 不可重复读 幻读
序言 脏读.不可重复读.幻读这几个概念开始接触和学习的时候是在大学学习数据库系统的时候,那时候对这几个专业名词的理解停留在概念文字上,并没有真正使用过实践中,最近工作中涉及到这几个概念方面的知识,就来 ...
- 脏读,不可重复读,幻读区别和避免
在了解脏读,不可重复度,幻读之前,首先要明白这三种情况的出现都是和数据库并发事务有关联的,如果所有的读写都按照队列的形式进行,就不会出现问题. 名词解析和解决方案 脏读 脏读又称无效数据读出(读出了脏 ...
- 快速理解脏读,不可重复读,幻读
介绍 要聊事务,不可避免的要提到数据库事务的四大特性:ACID atomic consistence isolation durability 先放一个表格,看看4个隔离级别会出现的各种问题,网上的解 ...
- MySQL可重复读和读已提交实现原理,深入理解MVCC。
1.隔离级别 MySQL中隔离级别分为4种,提未交读.读已提交.可重复读.串行化.同时MySQL默认隔离级别为可重复读. 图片 查看MySQL隔离级别 SELECT @@tx_isolation 设置 ...
- Mysql如何实现隔离级别 - 可重复读和读提交 源码分析
Abstract 本文会(1) 演示Mysql的两种隔离级别. (2) 跟着mysql的源代码来看看它是怎么实现这两种隔离级别的. Mysql的隔离级别 当有多个事务并发执行时, 我们需要考虑他们之 ...
- 三分钟了解MVCC(InnoDB如何实现可重复读和读已提交)
快照读和当前读 快照读 快照读是指读取数据时不是读取最新版本的数据,而是基于历史版本读取的一个快照信息(mysql读取undo log历史版本) , 快照读可以使普通的SELECT 读取数据时不用对表 ...
最新文章
- HTML5 学习之地理定位
- linux重装alsa,centos 6 安装alsa
- 金融领域下的数据挖掘算法应用:AdaBoost模型摩天
- K-periodic Garland CodeForces - 1353E(暴力+贪心+dp)
- centos下cmake安装
- redis 内存溢出_查漏补缺,Redis为什么会这么快,看完这七点你就知道了
- 曲线聚类_R语言确定聚类的最佳簇数:3种聚类优化方法
- java 类注释标准_Java 标准注释
- java 取余 负数_Java中有关负数取余的计算
- VC dll依赖性查看工具depends
- OSSH免费版华为Portal
- 共享自习室预约小程序APP系统开发设计方案
- 金山办公CEO章庆元:数字化、云化、订阅化趋势下,组织数字办公走向纵深
- 面向对象设计原则-03依赖倒置原则
- QT设置背景图片以及设置按钮
- 不改恶习,是否可往净土
- 盛大创新院许式伟:影响我一生的五个重要选择
- Android获取屏幕宽度高度并动态设置控件宽度,比例等
- 合并多个excel表格
- 如何利用GraphPad Prism 8 绘制生存曲线?