DBAtlas · 数据库运维图谱

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 使用专用连接。

在 DBAtlas 中打开 →

同一数据库的其他条目