redis事务通过multi和exec实现命令排队与单线程串行执行,不支持回滚;multi开启事务并进入排队模式,exec按fifo顺序原子性执行队列命令,配合watch可实现乐观锁,discard用于放弃事务。

Redis 事务通过 MULTI 和 EXEC 实现“收集—执行”两阶段操作,本质是命令排队+单线程串行执行,不依赖锁,也不回滚。
开启事务:MULTI 命令触发排队模式
MULTI 是事务起点,执行后客户端进入事务上下文,后续所有命令不再立即执行,而是被暂存到当前连接专属的命令队列中,返回 QUEUED 表示入队成功。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 每个连接独立维护自己的事务队列,互不影响
- MULTI 不可嵌套,重复执行会报错但不会中断当前事务状态
- 入队命令仍需语法正确;若存在明显错误(如参数缺失),会在 EXEC 阶段直接 abort 整个事务
提交执行:EXEC 触发批量、顺序、原子性提交
EXEC 是事务终点。它让 Redis 单线程按 FIFO 顺序依次执行队列中的全部命令,并将结果按执行顺序组装成数组返回。
- 执行过程不可中断——期间不会有其他客户端命令插入
- 所谓“原子性”仅指执行顺序和排他性,不是 ACID 意义上的原子:某条命令运行时出错(如对 string 执行 LPUSH),不会导致前面已成功命令回滚,错误命令返回对应错误信息,其余继续执行
- EXEC 返回结果数组长度等于队列命令数,每个元素对应一条命令的执行结果或错误
常见配合操作
实际使用中,MULTI/EXEC 往往与 WATCH 或 DISCARD 协同:
- WATCH + MULTI + EXEC:在 MULTI 前用 WATCH 监视一个或多个键,若这些键在 EXEC 前被其他客户端修改,则 EXEC 返回空数组,整个事务放弃执行(乐观锁)
- DISCARD:在 EXEC 前调用,清空当前队列,放弃事务,不执行任何命令
- 事务执行完即结束,下次需要事务必须重新 MULTI 开启










