众力资讯网

社招大厂高频题:为什么 Redis 事务不支持回滚?看这篇就够!

大家好,我是 31 岁、积极活泼、爱分享技术的小米,又来给你们搬运我社招面试中的真实经历啦!今天的小故事来自于上周五的



大家好,我是 31 岁、积极活泼、爱分享技术的小米,又来给你们搬运我社招面试中的真实经历啦!

今天的小故事来自于上周五的一个下午。当时我正拎着一杯芋圆奶茶,在一个光线柔和的会议室里,迎面坐着一个笑容温柔但眼神很专业的资深面试官。

他喝了一口美式,突然抛出一个看似轻飘飘的问题:

“小米,你给我说说,什么是事务?还有,Redis 事务是怎么实现的?三个阶段是什么?相关命令有哪些?”

那一刻我差点被芋圆噎住。不过没关系,咱技术人越紧张越要稳住,我把奶茶放下,脑子里以 5G 速度回放我踩过的坑,然后开始了我那套“奶茶事务”理论……

今天我就把当时的思考过程完整讲给你听,让你以后面试再遇到这种题,不紧张,不慌张,一杯奶茶讲给面试官听就行。

故事开场:奶茶店里的“事务”

我问面试官:“我能用个生活例子回答吗?”

他点点头。于是我说 :

想象你去奶茶店点了一杯 加珍珠、加芋圆但不要冰 的奶茶,这就是一个业务操作,包含多个步骤:

拿杯子

加珍珠

加芋圆

倒奶茶

封杯

这五步必须全部成功,你才能喝到那杯“米氏特调”。如果第三步“没芋圆了”,那这一杯就不应该做出来,要直接整单作废重新点。这其实就是:事务的本质(数据库事务)

事务(Transaction)是一组要么全部成功、要么全部失败的操作集合。

四大特性(ACID)也变得很好理解:

Atomicity(原子性):要么五步都执行,要么一杯都不做。

Consistency(一致性):不能出现“我没加芋圆却说给你加了”这种情况。

Isolation(隔离性):你点单的流程不应该被旁边那位小姐姐点单的流程干扰。

Durability(持久性):一旦奶茶做完封好杯,就不能第二天突然没了。

讲到这,面试官笑了,说:“不错,那你继续讲 Redis 事务。”于是我又喝了口奶茶,故事继续。

故事第二幕:Redis 的“事务”和数据库事务一点都不一样

我接着讲:

Redis 的事务更像是:

给奶茶店老板报备要做哪几步,但他不会帮你判断中间有没有芋圆,也不会在做的过程中帮你回滚,全靠你自己保证流程正确。

Redis 事务的本质其实只有两点:

Redis 事务是命令的“批量顺序执行”:你把一堆命令放进“队列”,然后一次性提交。

Redis 事务不保证原子性(不支持回滚):只要命令语法正确,提交之后 Redis 就一个一个执行,执行失败也不会回滚之前的命令。

面试官点点头,表示认可。于是我继续讲 Redis 事务的三阶段模型。

Redis 事务的“三个阶段”:就像你点奶茶的完整流程

我把 Redis 事务比作一个点单流程,让面试官更易理解。

第一阶段:命令入队(偏像你报备流程)

对应命令:MULTI

你对老板说:“我等下要做一杯奶茶,先不要急,听我报操作。”

Redis 回你:OK,开始排队吧。

此时所有后续命令都不会执行,而是进入队列。

第二阶段:命令排队(往队列里塞命令)

例如你执行:

Redis 不会执行,只会说:QUEUED(已排队)

这就像你在告诉老板:

先加珍珠

再加芋圆

再倒奶茶

老板只负责记录,不负责检查你讲的是不是废话。

第三阶段:执行事务(一次性全部提交)

使用命令:EXEC

Redis 开始按顺序执行你排队的所有命令。相当于你说:

“好了老板,开始做!”

老板照你说的流程一步步做。

特别注意:Redis 不支持回滚!

如果你的其中一步错了,比如:

只要不是语法错误,这个错误发生在执行期,Redis 不会停下,也不会回滚之前的操作。

就像你跟老板说:“先加珍珠,再加芋圆,再加冰块。”

结果你突然说:“哎呀我不喝冰的!”

老板会说:我已经加了冰,不退不改。

面试官继续追问:“那 Redis 如何防止别人篡改数据?”

你以为事务讲完就结束了吗?

这时面试官又问我:

“如果在事务排队阶段,有其他客户端修改了我要操作的数据怎么办?”

我笑着说:“Redis 已经替你想到这一点了!”

于是我讲了一个卖座的小故事:

Redis 的 WATCH:像贴在奶茶杯上的“封条”

你开始排队点单时,你可以告诉老板:“这个杯子贴上封条,别人不能动。”

Redis 的做法就是:

WATCH key1 key2 ...

它的意思是:我盯着这些 key,如果事务提交前它们被别人改了,我的事务就失败。

比如:

客户端 A 执行:

如果此时客户端 B 修改了 balance:

SET balance 9999

则 A 的 EXEC 会失败:

(nil)

就像老板发现有人撕开了封条,会告诉你:杯子被动过了,事务不能执行,你要不要重新来一杯?

这就是 Redis 乐观锁最经典的应用场景。

Redis 事务的全部命令总结(面试官最爱问)

为了让面试官彻底满意,我把所有命令一口气总结:

你只要把这些记住,面试现场绝对稳稳的。

讲完故事后,面试官点头了

讲完以上内容后,面试官靠着椅背,看了我几秒,然后说:

“小米你这个讲奶茶的比喻挺有意思。逻辑清晰,场景化强,讲明白了。”

然后他做了个让我差点激动落泪的动作:在简历上写了一个大大的 √ 。

那一刻我深吸一口气,感觉奶茶又变甜了。

最后的总结(面试话术版)

如果你在面试时遇到同样的问题,可以直接这样回答:

1、什么是事务?

事务是一组操作,要么全部成功,要么全部失败,具有 ACID 特性。

2、Redis 事务的概念?

Redis 事务是通过将命令排队并一次性顺序执行,实现“批处理”的效果。

Redis 事务不支持自动回滚,只保证命令执行过程不会被其他客户端中断。

3、Redis 事务的三个阶段?

MULTI 开启事务

命令入队并排队

EXEC 执行事务

4、Redis 事务相关命令?

MULTI

EXEC

DISCARD

WATCH

UNWATCH

END

希望今天的小故事,可以让你在下一次面试时,不但答出 Redis 事务,还能答得又稳又好。

如果你喜欢我这种“讲故事 + 奶茶类比”的技术分享方式,记得告诉我,我会继续更新更多社招高频题!