DBAtlas · Atlas de operações de banco de dados

ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed

Redis

O 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.

Abrir no DBAtlas →

Mais entradas deste banco