Si vous avez besoin d'une annulation de transaction, je vous recommande d'utiliser autre chose que Redis. Les transactions Redis ne sont pas les mêmes que pour les autres datastores. Même Multi/Exec ne fonctionne pas pour ce que vous voulez - d'abord parce qu'il n'y a pas de retour en arrière. Si vous souhaitez une restauration, vous devrez dérouler les deux listes afin de pouvoir restaurer - et espérons qu'entre notre condition d'erreur et la "restauration", aucun autre client n'a également modifié l'une ou l'autre des listes. Faire cela de manière saine et fiable n'est ni trivial, ni simple. Ce ne serait probablement pas non plus une bonne question pour SO car elle serait très large et non spécifique à Redis.
Maintenant, pourquoi EXEC ne fait pas ce que l'on pourrait penser. Dans votre scénario proposé MULTI/EXEC uniquement traite les cas de :
- Vous configurez des WATCHes pour vous assurer qu'aucun autre changement ne se produit
- Votre client décède avant d'émettre EXEC
- Redis n'a plus de mémoire
Il est tout à fait possible d'obtenir des erreurs à la suite de l'émission de la commande EXEC. Lorsque vous lancez EXEC, Redis exécute tous commandes dans la file d'attente et renvoient une liste d'erreurs. Il ne fournira pas le cas du fonctionnement de l'ajout à la liste-1 et de l'échec de l'ajout à la liste-2. Vous auriez toujours vos deux listes désynchronisées. Lorsque vous émettez, dites un LPUSH après avoir émis MULTI, vous obtiendrez toujours un OK
sauf si vous :
- a) a précédemment ajouté une montre et quelque chose dans cette liste a changé ou
- b) Redis renvoie une condition OOM en réponse à une commande push en file d'attente
DISCARD ne fonctionne pas comme certains pourraient le penser. DISCARD est utilisé au lieu de EXEC, pas comme un mécanisme de restauration. Une fois que vous avez émis EXEC, votre transaction est terminée. Redis n'a aucun mécanisme de restauration - ce n'est pas le but de la transaction de Redis.
La clé pour comprendre ce que Redis appelle les transactions est de réaliser qu'il s'agit essentiellement d'une file d'attente de commandes au niveau de la connexion client. Ils ne sont pas une machine d'état de base de données.