数据库的脏读、不可重复读和幻读分别是什么?
回答思路
什么是脏读?
大佬: 你知道,Mysql里面有个词叫脏读吗?啥意思你知道不?
凯歌: 脏读啊,知道,我给你画个图,然后照着图给你说
凯歌: 下面我们按照图,按照执行时间顺序一步步说
开始:数据 name = 凯歌
第一:事务B-->开始执行
第二:事务A-->开始执行
第三:事务B-->修改name = 鱼皮
第四:事务A-->获得 name = 鱼皮
第五:事务B-->提交失败,数据回滚,鱼皮-->凯歌
结果:事务A得到了事务B没有成功修改的数据
大佬: 哦,我明白了,就是它把未成品给拿回去了。
凯歌: 对,就这意思。
什么是不可重复读?
大佬: 那啥是不可重复读啊?
凯歌: 这个也简单,老样子,我先画图,然后说
凯歌: 如上图
开始:name=凯歌
第一:事务A第一次查询,name=凯歌
第二:事务B修改,凯歌-->鱼皮
第三:事务B提交,结束
第四:事务A第二次查询,name=鱼皮
凯歌: 在事务A中,两次查询得到的结果,不一致,称为不可重复读。
什么是幻读?
大佬: 行,我懂了,开始画图吧。
凯歌: 啊?画图?什么图?
大佬: 幻读啊?还能有啥。
凯歌: 哦哦哦,明白
凯歌: 如上图
开始:年龄age>17的数据有3条
第一:事务A开始第一次查询,得到3条结果
第二:事务B新增一条,age=21
第三:事务A开始第二次查询,得到4条结果
事务A,两次查询数量不一致
大佬: 哎?这个和不可重复读,没啥区别啊?
凯歌: 不不不,有区别的哈,幻读说的现象是,我查询的数量变化了,但是内容没变,不可重复读,说的是我查询的内容发生了变化,一个是个数,一个是内容,描述的方向是不同的哈。
凯歌: 打比方,我们去买包子,要买10个韭菜鸡蛋馅的,幻读的意思是,我付完钱数的时候是10个,到家后发现是11个,并且第十一个还是韭菜鸡蛋的,好像出现幻觉了是的,而不可重复读,更像是我们付完钱的时候,看十个都是韭菜鸡蛋的,结果再看的时候发现是里面有5个是猪肉大葱的,数量没变,但是东西变了。
三者对比图
大佬: 行吧,我差不多明白了,但是感觉好像还差点。
凯歌: 行,那为了让你更清楚一点,我们画个对比表格,让你看下。
维度 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
本质 | 读到错误的数据 | 两次查询内容不一致 | 两次查询数量不一致 |
读未提交 | ✅ 可能发生 | ✅ 可能发生 | ✅ 可能发生 |
读已提交 | ❌ 防止 | ✅ 可能发生 | ✅ 可能发生 |
可重复读 | ❌ 防止 | ❌ 防止 | ✅ 可能发生 |
可串行化 | ❌ 防止 | ❌ 防止 | ❌ 防止 |