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 直接报错并放弃整个事务,这类错误本应在客户端或评审阶段就拦下来。