ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed
RedisO que significa?
WATCH foi enviado dentro de um bloco MULTI aberto. Para optimistic locking, o WATCH deve colocar as chaves sob observação ANTES de a transação começar; se chamado depois do MULTI, ele é rejeitado. O erro não aborta a transação; apenas o WATCH falha e nada fica sob observação.
Por que acontece?
WATCH e MULTI escritos em ordem inversa no código (primeiro MULTI, depois WATCH); chamar WATCH dentro do wrapper de pipeline/transação da biblioteca cliente; ou usar uma conexão do pool que ficou em estado MULTI. Nesse caso, o EXEC é executado mesmo que as chaves que deveriam estar sob observação tenham mudado; a proteção contra conflitos esperada não entra em ação.
Como resolver
Ordem correta: WATCH key -> (ler os valores) -> MULTI -> comandos -> EXEC. Se o EXEC retornar nil, uma chave observada mudou; repita a operação desde o início. Use a API de WATCH/transação da biblioteca cliente (por exemplo, helpers de watch + pipeline). Observação: comandos de pub/sub como SUBSCRIBE não são rejeitados dentro do MULTI; eles são enfileirados e a conexão passa para o modo de assinatura após o EXEC; isso também não é recomendado, use uma conexão dedicada para pub/sub.
Mais entradas deste banco
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range (o offset de bit não é um inteiro ou está fora do intervalo)
- ERR Protocol error: invalid multibulk lengthProtocol error: invalid multibulk length (erro de protocolo: comprimento multibulk inválido)
- ERR Number of keys can't be greater than number of argsEVAL/EVALSHA: numkeys exceeds argument count (numkeys excede o número de argumentos)
- ERR WAIT cannot be used with replica instancesWAIT cannot be used with replica instances (WAIT não pode ser usado em instâncias réplica)
- ERR Background append only file rewriting already in progressAOF rewrite already in progress
- IOERR error or timeout reading from target instanceMIGRATE: I/O error or timeout to target
- ERR Error compiling script (new function)Error compiling Lua script