八股:数据库的脏读、不可重复读和幻读分别是什么?

47 阅读3分钟

数据库的脏读、不可重复读和幻读分别是什么?

回答思路

什么是脏读?

大佬: 你知道,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个是猪肉大葱的,数量没变,但是东西变了。

三者对比图

大佬: 行吧,我差不多明白了,但是感觉好像还差点。

凯歌: 行,那为了让你更清楚一点,我们画个对比表格,让你看下。

维度脏读不可重复度幻读
本质读到错误的数据两次查询内容不一致两次查询数量不一致
读未提交✅ 可能发生✅ 可能发生✅ 可能发生
读已提交❌ 防止✅ 可能发生✅ 可能发生
可重复读❌ 防止❌ 防止✅ 可能发生
可串行化❌ 防止❌ 防止❌ 防止