ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed
Redis¿Qué significa?
Se envió WATCH dentro de un bloque MULTI abierto. Para el bloqueo optimista, WATCH debe poner las claves bajo vigilancia ANTES de que empiece la transacción; si se llama después de MULTI, se rechaza. El error no aborta la transacción; solo falla WATCH y no se vigila nada.
¿Por qué ocurre?
WATCH y MULTI escritos en orden inverso en el código (primero MULTI y luego WATCH); llamar a WATCH dentro del wrapper de pipeline/transacción de la biblioteca cliente; o usar una conexión del pool que quedó en estado MULTI. En este caso EXEC se ejecuta aunque hayan cambiado las claves que debían vigilarse; la protección contra conflictos esperada no actúa.
Cómo solucionarlo
Orden correcto: WATCH key -> (leer valores) -> MULTI -> comandos -> EXEC. Si EXEC devuelve nil, cambió una clave vigilada; reintente la operación desde el principio. Use la API de WATCH/transacciones de la biblioteca cliente (p. ej., helpers de watch + pipeline). Nota: los comandos pub/sub como SUBSCRIBE no se rechazan dentro de MULTI; se ponen en cola y la conexión pasa al modo de suscripción tras EXEC; esto tampoco se recomienda, use una conexión dedicada para pub/sub.
Más entradas de este motor
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range (el offset de bit no es un entero o está fuera de rango)
- ERR Protocol error: invalid multibulk lengthProtocol error: invalid multibulk length (error de protocolo: longitud multibulk no válida)
- ERR Number of keys can't be greater than number of argsEVAL/EVALSHA: numkeys exceeds argument count (numkeys supera el número de argumentos)
- ERR WAIT cannot be used with replica instancesWAIT cannot be used with replica instances (WAIT no puede usarse en instancias 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