首页/数据/Redis 进阶速查/MULTI/EXEC 事务与执行语义
性能与排障129 条

MULTI/EXEC 事务与执行语义

MULTI 开启事务、命令入队,EXEC 一次性顺序执行;入队期错误(如语法)导致 EXECABORT,执行期错误不会回滚已执行命令。

Redis 进阶速查数据更新于 2026-10-13

MULTI 与 EXEC 是什么

MULTI 开启事务,之后的命令先入队,EXEC 时一次性顺序执行,DISCARD 丢弃队列退出事务。事务保证执行阶段不被其他客户端插队,但不提供回滚:入队阶段的错误会让整个事务放弃,执行阶段的单条错误只影响那一条命令,已经执行的不会撤销。

基本信息

开启MULTI
提交EXEC
取消DISCARD
条件执行WATCH 与 UNWATCH 做乐观锁
保障范围执行期间不被打断;不提供回滚
错误类型入队期错误整体放弃,执行期错误只影响该条命令

典型使用场景

  • 多键联动更新:同时更新互相关联的键,避免中间状态被读到
  • 计数与状态一起变更:一条事务里完成读改写
  • 配合 WATCH 的条件更新:库存扣减这类场景
  • 减少往返:把多条命令合并成一次请求响应
  • 语义验证:用事务确认命令之间的可见性关系
  • 不该用的场景:依赖原子回滚的业务逻辑

基本用法

基本用法
MULTI                 # 开启事务,后续命令先入队
SET order:1 paid      # 入队,不立即执行
INCR order:count      # 入队
EXEC                  # 一次性顺序执行,返回结果数组
DISCARD               # 事务未提交前丢弃入队命令
WATCH stock:1001      # 监视键,配合 EXEC 做条件执行
UNWATCH               # 主动取消全部监视

命令语义

命令作用注意
MULTI开启事务并入队后续命令没有嵌套事务的概念
EXEC顺序执行全部入队命令按顺序返回每条命令的结果
DISCARD清空队列并退出事务状态用于中途放弃
WATCH监视键,键变化则放弃事务必须与 EXEC 配对使用
UNWATCH取消所有监视事务执行或取消后也会自动清除
事务里的命令顺序执行,没有隔离级别的概念:其他客户端看不到执行中的中间状态,但这不等同于关系库的完整事务语义。
入队阶段的错误(命令名写错、参数个数不对)会让 EXEC 直接报错并放弃整个事务,这类错误本应在客户端或评审阶段就拦下来。

易错点

  • 把 Redis 事务当关系库事务用,遇到执行期错误时以为会自动回滚
  • 事务里塞入慢命令,执行阶段阻塞整段时间,拖慢所有并发请求
  • 忘记 DISCARD 或 UNWATCH,连接复用时残留事务状态导致后续命令行为异常
  • 用事务做强一致假设,忽略主从复制与故障切换带来的窗口

数据来源与参考

  • Redis 官方文档:事务说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌