DBAtlas · Atlas für Datenbankbetrieb

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

Redis

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

In DBAtlas öffnen →

Weitere Einträge zu dieser Datenbank