【数据库】快速理解脏读、不可重复读、幻读

【数据库】快速理解脏读、不可重复读、幻读快速理解脏读 不可重复读 幻读 理解这三种由于并发访问导致的数据读取问题 再理解事务隔离级别就简单多了 1 脏读 读取未提交数据 A 事务读取 B 事务尚未提交的数据 此时如果 B 事务发生错误并执行回滚操作 那么 A 事务读取到的数据就是脏数据 就好像原本的数据比较干净 纯粹 此时由于 B 事务更改了它 这个数据变得不再纯粹 这个

                             快速理解脏读、不可重复读、幻读?

 

理解这三种由于并发访问导致的数据读取问题,再理解事务隔离级别就简单多了。

 

【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前后两次读取到的数据总量应该一致


趁热打铁,既然理解了脏读、不可重复读、幻读,那么接下来看看事务隔离级别是怎么个回事【数据库】事务隔离级别

不可

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204872.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午7:20
下一篇 2026年3月19日 下午7:20


相关推荐

  • ArcGIS二次开发入门(一)「建议收藏」

    ArcGIS二次开发入门(一)「建议收藏」作者:朱金灿来源:http://blog.csdn.net/clever101      公司培训ArcGIS二次开发(C#作为开发语言),自己回家动手实践了一下。 1.首先是二次开发环境的安装,需要装下面两项:

    2022年6月29日
    69
  • ubuntu 强制删除文件夹[通俗易懂]

    ubuntu 强制删除文件夹[通俗易懂]sudorm文件夹的名称-rf输入Ubuntu的密码

    2022年6月12日
    33
  • 费马小定理题

    费马小定理题费马小定理 假如 p 是质数 且 gcd a p 1 那么 nbsp A 题 HDU 4704 首先是挡板法 隔板法 然后用即可 高中数学范围不多叙述 然后得到答案是 nbsp 这题读入数据大 就算快速幂也肯定 TLE 所以用费马小定理 把数据规模降到 int 范围内 时间复杂度降低因为 1e9 7 是一个素数 基本可以假设 N 1 不是 1e9 7 的倍数 这一点我没想到 所以没写出来 所

    2025年11月16日
    7
  • java final keyword

    java final keyword

    2021年12月7日
    44
  • 一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发

    一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发C++技术牛人,编写实现的3D游戏演示Demo源代码。框架清晰,三维效果ok,适用于所有人学习3D游戏开发。【注】GetDeviceCaps(hDC,LOGPIXELSY)用于取得每英寸有多少像素MulDiv函数(被乘数,分子,分母)=nPointSize*GetDeviceCaps(hDC,LOGPIXELSY)/72,如果不支持硬件顶点处理,可以使用软件…

    2022年5月9日
    61
  • MAC电脑 系统 恢复出厂设置

    MAC电脑 系统 恢复出厂设置具体步骤:1首先开启Mac的电源开关,同时按住command+R键进入恢复模式,我们就能看MacOSX实用工具。2选择磁盘工具–然后选择上面一般是MacintoshHD这个选项,右侧选择抹掉。意思就是删除所有内容重新安装新的系统。3重新启动Mac,这时出现地球标志,等待更新完成。这里PC6小编要提醒各位进行这项操作的Mac用户,由于在线恢复需要从苹果服务器下载完整的OS

    2022年6月21日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号