上一题下一题

Redis MULTI/EXEC 事务为什么不提供传统数据库的回滚能力?

基础版
来源:tencent初级工程师Redis命令执行原子性数据库事务回滚Redis事务
草稿该题目为草稿状态,前台公开题库中不可见。
答案解析

Redis 的 MULTI/EXEC 事务和传统关系型数据库事务不太一样,它更像是“把一组命令打包后按顺序一次性执行”。

在 Redis 里,执行 MULTI 后,后续命令会先进入队列,直到 EXEC 时才按顺序执行。Redis 保证的是:在 EXEC 执行这批命令期间,不会被其他客户端的命令插入,所以它具备一定的原子性和隔离性。但它不提供传统数据库那种基于 undo log 的回滚能力。

主要原因有几个:

1. Redis 事务设计目标是简单和高性能 Redis 是内存数据库,核心优势是快。如果为了事务支持回滚,就需要维护每条命令执行前的数据快照或 undo log,这会增加内存和性能开销,和 Redis 的设计理念不太一致。

2. Redis 认为大部分错误应该在开发阶段暴露 Redis 官方的思路是,命令写错、类型用错这类问题属于程序 bug,不应该依赖运行时回滚来兜底。

3. Redis 事务中错误分两类处理 如果是在入队阶段就发现错误,比如命令语法错误,EXEC 时整个事务会被放弃执行。

登录后查看完整内容