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 时整个事务会被放弃执行。
登录后查看完整内容
