ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed(不允许在 MULTI 中使用 WATCH)
Redis含义
在打开的 MULTI 块中发送了 WATCH。为实现乐观锁,WATCH 必须在事务开始之前将键置于监视之下;在 MULTI 之后调用会被拒绝。该错误不会中止事务;只有 WATCH 失败,没有任何键被监视。
原因
代码中 WATCH 和 MULTI 的顺序写反了(先 MULTI 再 WATCH);在客户端库的管道/事务封装中调用 WATCH;或使用了处于 MULTI 状态的连接池连接。在这种情况下,即使本应被监视的键已发生变化,EXEC 仍会执行;预期的冲突保护不会生效。
解决方法
正确的顺序:WATCH key -> (读取值)-> MULTI -> 命令 -> EXEC。如果 EXEC 返回 nil,说明某个被监视的键已变化;从头重试该操作。使用客户端库的 WATCH/事务 API(例如 watch + pipeline 辅助方法)。注意:SUBSCRIBE 等 pub/sub 命令在 MULTI 中不会被拒绝,它们会被排队,EXEC 之后连接切换为订阅模式;这同样不推荐,请为 pub/sub 使用专用连接。
同一数据库的其他条目
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range(位偏移量不是整数或超出范围)
- ERR Protocol error: invalid multibulk lengthProtocol error: invalid multibulk length(协议错误:无效的 multibulk 长度)
- ERR Number of keys can't be greater than number of argsEVAL/EVALSHA: numkeys exceeds argument count(EVAL/EVALSHA:numkeys 超过参数数量)
- ERR WAIT cannot be used with replica instancesWAIT cannot be used with replica instances(WAIT 不能用于副本实例)
- ERR Background append only file rewriting already in progressAOF rewrite already in progress(AOF 重写已在进行中)
- IOERR error or timeout reading from target instanceMIGRATE: I/O error or timeout to target(MIGRATE:与目标之间发生 I/O 错误或超时)
- ERR Error compiling script (new function)Error compiling Lua script(编译 Lua 脚本出错)