*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 不检查语法,直接清空队列。