Hvis du har brug for tilbagerulning af transaktioner, anbefaler jeg at bruge noget andet end Redis. Redis-transaktioner er ikke de samme som for andre datalagre. Selv Multi/Exec virker ikke til det, du ønsker - først fordi der ikke er nogen tilbagerulning. Hvis du ønsker rollback, bliver du nødt til at trække begge lister ned, så du kan gendanne - og håbe, at der mellem vores fejltilstand og "rollback" ikke har ændret nogen anden klient på nogen af listerne. At gøre dette på en fornuftig og pålidelig måde er ikke trivielt eller enkelt. Det ville nok heller ikke være et godt spørgsmål for SO, da det ville være meget bredt og ikke Redis-specifikt.
Nu til hvorfor EXEC ikke gør, hvad man måske tror. I dit foreslåede scenario kun MULTI/EXEC behandler sager om:
- Du konfigurerer WATCH'er for at sikre, at der ikke er sket andre ændringer
- Din klient dør før udstedelse af EXEC
- Redis er løbet tør for hukommelse
Det er fuldt ud muligt at få fejl som et resultat af at udstede EXEC-kommandoen. Når du udsteder EXEC, vil Redis udføre alle kommandoer i køen og returnerer en liste over fejl. Det vil ikke give tilfælde af, at tilføjelse til-liste-1 fungerer og tilføjelse til-liste-2 fejler. Du ville stadig have dine to lister ude af synkronisering. Når du udsteder, sig en LPUSH efter at have udstedt MULTI, vil du altid få en OK
tilbage medmindre du:
- a) tidligere tilføjet et ur, og noget på listen ændret eller
- b) Redis returnerer en OOM-tilstand som svar på en push-kommando i kø
DISCARD virker ikke, som nogle måske tror. DISCARD bruges i stedet for EXEC, ikke som en rollback-mekanisme. Når du har udstedt EXEC, er din transaktion gennemført. Redis har ikke nogen tilbagerulningsmekanisme overhovedet - det er ikke det, Redis' transaktion handler om.
Nøglen til at forstå, hvad Redis kalder transaktioner, er at indse, at de i bund og grund er en kommandokø på klientforbindelsesniveau. De er ikke en databasetilstandsmaskine.