DBAtlas · Atlas de operaciones de bases de datos

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.

Abrir en DBAtlas →

Más entradas de este motor