大家好,我是小米,31岁配资平台查询网,程序员一枚。
最近帮一个老同学刷面试题的时候,遇到了一道看似简单,实则暗藏杀机的题:
“请解释什么是脏读、幻读、不可重复读,并说明它们的区别。”
我当时笑了:
“这题?不就是事务隔离级别的老梗嘛,几分钟就讲完。”
结果一说出口,我发现身边好几个小伙伴听得一脸懵,甚至有人把幻读和不可重复读混成了一锅粥。
于是我决定,今天咱们不背八股,不死记定义,而是用一个故事——咖啡店的奇妙一日——帮你彻底搞定这三个概念。
故事背景:小米的咖啡店
想象一下,我在公司楼下开了一家“小米咖啡馆”,生意不错,每天都有程序员来这边边写代码边喝咖啡。
为了防止账本出错,我雇了两个店员:小A负责记账,小B负责收银。
我们用的“收银系统”就是一张 Excel 表,记录每个客人的消费。
这张表就是我们的数据库,而店员之间的操作冲突,就是数据库的并发事务问题。
第一幕:脏读(Dirty Read)
这天早上,小A和小B同时在操作账本。
小B刚收完钱,想把“张三喝了一杯拿铁,28块”记到账本里。
可是她写到一半,被隔壁奶茶店的同事喊走了。
此时账本里只写了一行临时数据:
这笔记录还没正式提交。
偏偏小A这时候来查账,看到账本里的张三消费28元,于是直接告诉老板:
“今天营业额28块了!”
结果小B回来一看,发现刚才输错了——其实张三只花了18块。她撤销了刚才的操作(回滚事务),重新输入了正确的记录。
老板就懵了:
“刚才你不是说28吗?怎么又变18了?”
这就是脏读:
一个事务读到了另一个事务还没提交的数据,而且这数据之后可能被回滚,导致你读到的内容是无效的。
在数据库里,脏读一般发生在读未提交(READ UNCOMMITTED)隔离级别下。
它是最“放飞自我”的隔离级别,别人数据还在改,你就能看见。
这就像偷看别人还没写完的日记,有可能人家后面会涂改。
第二幕:不可重复读(Non-repeatable Read)
中午的时候,小B在算账,准备统计一下李四今天消费了多少钱。
第一次查账的时候,她看到:
“李四:消费 35 元”。
结果她去冲了一杯咖啡回来,小A在这期间帮李四补记了一份甜点消费 +15 元,直接修改了原来的那行数据。
小B第二次查的时候,李四的消费变成了50元。
小B一脸疑惑:
“我记得刚才查是35块啊?怎么又变了?”
这就是不可重复读:
在同一个事务里,两次读取同一条记录,结果不一样,因为在你查询的间隙,别人把这条数据改了或删了。
它常出现在读已提交(READ COMMITTED)隔离级别。
这个级别解决了脏读——至少等别人提交之后你才看见——但是没法保证你多次读取同一行数据会一致。
第三幕:幻读(Phantom Read)
下午的时候,小B要做一个任务:统计今天买咖啡的顾客数量。
第一次查的时候,账本里有10个人的消费记录。
她离开去泡茶的两分钟里,小A正好又接待了两个新客人,把他们加进了账本。
小B第二次统计的时候,顾客数量变成了12个!
她惊呼:
“咦?我明明查过一次了,怎么又多了人?”
注意,这跟“不可重复读”不一样。
不可重复读是同一行数据被改了,幻读是多出来了新行(或少了行)。
定义就是:
在同一个事务中,两次执行相同的查询语句,结果的行数不一致,因为其他事务新增或删除了符合条件的记录。
幻读的典型隔离级别是可重复读(REPEATABLE READ)下仍可能发生(在MySQL InnoDB下,因为MVCC机制,幻读更多是被Gap Lock或Next-Key Lock解决的)。
故事回顾:三者对比
事务隔离级别速记表
为了应对面试,我整理了一个简单的速记口诀——未读脏,不可重,幻影行:
其中:
✔ 表示可能发生
✘ 表示不会发生
面试答题思路
如果面试官问你这道题,不要一上来就死背定义,你可以用这个三步法:
1、先抛场景(故事化,体现你能让别人听懂)
脏读:读到了别人还没交的作业,结果作业被擦掉了。
不可重复读:同一份作业,第一次看是A,第二次看变成B。
幻读:第一次看班上有30人交了作业,第二次看多了两个人。
2、再上定义(用一句话精准解释)
脏读:读到未提交的数据。
不可重复读:同一行数据读取两次不一致。
幻读:同条件查询结果集的行数不同。
3、最后给解决方案(加分项)
脏读 → READ COMMITTED 或更高隔离级别
不可重复读 → REPEATABLE READ 或更高
幻读 → SERIALIZABLE 或锁机制
这样答题既显得你理解深刻,又不会掉进背书的陷阱。
面试解答
我在帮朋友模拟面试的时候发现,很多人记住了概念,却在区分不可重复读和幻读的时候犯迷糊。
其实可以用一句口诀来记:
改行变值,不可重复读;添行删行,才叫幻读。
此外,记住面试官常用的“套娃式”追问:
“那InnoDB的可重复读隔离级别还会有幻读吗?”
“MySQL是怎么避免幻读的?”
“MVCC能解决幻读吗?”
只要你理解故事场景,这些追问都能举例回答,不会被绕晕。
END
事务隔离这块,看似是数据库的基础概念,但面试的时候,考察的往往不仅是你记不记得定义,而是你能不能用业务场景去解释,让一个非技术的人都能明白。
下次如果面试官再问你脏读、幻读、不可重复读,你就想想咱们的小米咖啡馆——账本上的那些“奇妙现象”,保证你讲得又生动又精准。
毕竟配资平台查询网,技术说到底,讲的还是人与数据的故事。
东方优配提示:文章来自网络,不代表本站观点。