打开网易新闻 查看精彩图片

生活中我们都懂好几个人同时翻看、修改同一份资料,很容易看错、看乱的逻辑,其实计算机里的MySQL多个事物同时读取数据,和这个道理一模一样。不用晦涩术语,普通人也能听懂底层逻辑。

很多初学MySQL的朋友,一听到脏读、不可重复读、幻读这三个名词就头大,感觉特别抽象难懂。

其实根本不用记复杂原理,它们就是多个人同时操作数据库时,出现的三种数据读取混乱现象。今天我完全抛开专业术语,用咱们日常能接触到的生活例子,一次性给你讲明白三者的区别,新手看完就能彻底分清。

先简单铺垫背景

先简单铺垫背景

我们可以把 MySQL 数据库想象成一本公共账本,所有人都可以同时翻看、修改账本里的内容。每一个人操作账本,就相当于数据库里的一个事务

当很多人同时看账本、改账本,没人做好隔离约束时,就会出现三种常见问题:脏读、不可重复读、幻读

一、什么是脏读?

一、什么是脏读?

通俗一句话:读到了别人临时修改、最后又反悔作废的数据

生活场景举例:办公室有一本公用记账本。同时小王临时把账本上自己的花销改成了500元,还没有最终确认定稿,临时想改回来。这时候你刚好凑过来翻看账本,看到了500元这个数字。结果小王反悔了,把数字又改回了真实的300元,还擦掉了刚才的修改痕迹。

你刚才看到的500元,就是无效、作废、不干净的数据,这就是脏读

放到MySQL里:一个事务修改了数据,还没正式提交确认;另一个事务提前读到了这个未提交的数据;前一个事务最后回滚撤销了修改,你读到的数据就是虚假无效的,就是脏读。核心:读了别人没定稿、中途作废的数据

二、什么是不可重复读?

二、什么是不可重复读?

通俗一句话:同一个人,前后两次看同一条数据,结果却不一样

生活场景举例:你坐在原地,第一次翻看记账本,看到小王花销是300元。你没有合上书,过了一分钟,准备再核对一遍,第二次再看同一个位置。这期间别人偷偷翻开账本,把小王的花销改成了600元,还确认定稿了。

你前后两次看同一个地方,数字却完全不一样,一脸懵,这就是不可重复读

放到MySQL里:同一个事务内,先后两次查询同一条数据;中间被其他事务修改并提交了数据;两次查询结果不一致,就是不可重复读。核心:同一条数据,前后两次读,内容变了

三、什么是幻读?

三、什么是幻读?

通俗一句话:前后统计总数,莫名多出或者少了几条数据,像产生了幻觉一样

生活场景举例:你先数了一遍记账本里一共有10条开销记录。你没合上本子,过一会儿想再数一遍核对。这期间别人悄悄新增了1条新记录,或者删掉了1条旧记录。

你再一数,变成了11条或者9条,你以为自己数错了、产生了幻觉,这就是幻读

放到MySQL里:同一个事务,前后两次查询一批数据、统计总数;中间其他事务新增、删除了数据;前后查到的数据条数不一样,仿佛凭空多出来、少出来数据,就是幻读。

核心:数据条数变了,像凭空多了、少了,产生幻觉

一句话快速区分三者

一句话快速区分三者

· 脏读:读到了别人没确认、反悔作废的假数据;

· 不可重复读:同一条数据,自己前后看两遍,数值变了;

· 幻读:一批数据总数,自己前后数两遍,条数变了。

是不是瞬间就懂了?其实这三个概念一点都不高深,就是多人同时操作公共数据时出现的三种混乱情况,弄懂生活例子,就永远不会混淆。

后续我还会持续用生活化大白话,分享MySQL零基础入门干货、事务隔离级别、数据库基础知识点,不用死记硬背,轻松学懂编程底层逻辑。喜欢的朋友可以点赞+关注,带你从零玩转MySQL,不走弯路!