ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed
RedisWas bedeutet das?
WATCH wurde innerhalb eines offenen MULTI-Blocks gesendet. Für optimistisches Locking muss WATCH Keys VOR Beginn der Transaktion unter Beobachtung stellen; nach MULTI aufgerufen wird es abgelehnt. Der Fehler bricht die Transaktion nicht ab; nur WATCH schlägt fehl, und nichts wird beobachtet.
Ursache
WATCH und MULTI stehen im Code in umgekehrter Reihenfolge (zuerst MULTI, dann WATCH); Aufruf von WATCH innerhalb des Pipeline-/Transaktions-Wrappers der Client-Bibliothek; oder Nutzung einer Pool-Verbindung, die im MULTI-Zustand zurückgelassen wurde. In diesem Fall läuft EXEC auch dann, wenn sich die zu beobachtenden Keys geändert haben; der erwartete Konfliktschutz greift nicht.
Lösung
Richtige Reihenfolge: WATCH key -> (Werte lesen) -> MULTI -> Befehle -> EXEC. Liefert EXEC nil, hat sich ein beobachteter Key geändert; wiederhole die Operation von vorn. Nutze die WATCH-/Transaktions-API der Client-Bibliothek (z. B. watch- + pipeline-Helfer). Hinweis: Pub/Sub-Befehle wie SUBSCRIBE werden innerhalb von MULTI nicht abgelehnt; sie werden eingereiht und die Verbindung wechselt nach EXEC in den Subscribe-Modus; auch das wird nicht empfohlen, nutze eine eigene Verbindung für Pub/Sub.
Weitere Einträge zu dieser Datenbank
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range
- ERR Protocol error: invalid multibulk lengthProtocol error: invalid multibulk length
- ERR Number of keys can't be greater than number of argsEVAL/EVALSHA: numkeys exceeds argument count
- ERR WAIT cannot be used with replica instancesWAIT cannot be used with replica instances
- 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