DBAtlas · Atlas d'exploitation des bases de données

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

Redis

Que signifie cette erreur ?

WATCH a été envoyé à l'intérieur d'un bloc MULTI ouvert. Pour le verrouillage optimiste, WATCH doit placer les clés sous surveillance AVANT le début de la transaction ; appelé après MULTI, il est refusé. L'erreur n'annule pas la transaction ; seul WATCH échoue et rien n'est surveillé.

Cause

WATCH et MULTI écrits dans l'ordre inverse dans le code (MULTI d'abord, puis WATCH) ; appel de WATCH dans le wrapper pipeline/transaction de la bibliothèque cliente ; ou utilisation d'une connexion du pool laissée en état MULTI. Dans ce cas, EXEC s'exécute même si les clés censées être surveillées ont changé ; la protection attendue contre les conflits ne s'applique pas.

Comment la corriger

Ordre correct : WATCH key -> (lecture des valeurs) -> MULTI -> commandes -> EXEC. Si EXEC renvoie nil, une clé surveillée a changé ; relancez l'opération depuis le début. Utilisez l'API WATCH/transaction de la bibliothèque cliente (par ex. helpers watch + pipeline). Remarque : les commandes pub/sub comme SUBSCRIBE ne sont pas refusées dans MULTI ; elles sont mises en file et la connexion passe en mode subscribe après EXEC ; c'est également déconseillé, utilisez une connexion dédiée au pub/sub.

Ouvrir dans DBAtlas →

Autres entrées pour ce moteur