*Redis DISCARD 命令
DISCARD 取消事务队列中的所有命令,退出事务状态。
*语法
DISCARD
*参数说明
该命令无额外参数。
*返回值
成功取消时返回 OK;如果不在事务中则报错。
*时间复杂度
O(N),N 为事务队列中命令数量。
*示例
*取消事务
> MULTI
OK
> SET a 1
QUEUED
> SET b 2
QUEUED
> DISCARD
OK
*不在事务中调用
> DISCARD
(error) ERR DISCARD without MULTI
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR DISCARD without MULTI | 当前未处于 MULTI 事务状态 | 必须先执行 MULTI |
*最佳实践
- 当业务逻辑判定事务不需要执行时,用 DISCARD 安全回滚队列。
- WATCH 的乐观锁在 DISCARD 后不会自动重试,需客户端自行处理。
- DISCARD 后连接恢复正常非事务状态。
*FAQ
DISCARD 和 EXEC 有什么区别? EXEC 提交并执行队列命令;DISCARD 清空队列并退出事务。
DISCARD 会解锁 WATCH 的 key 吗? 会,DISCARD 会解除所有 WATCH 监控。
事务中某条命令语法错误还能 DISCARD 吗? 可以,DISCARD 不检查语法,直接清空队列。