Se hai bisogno del rollback della transazione, ti consiglio di usare qualcosa di diverso da Redis. Le transazioni Redis non sono le stesse degli altri datastore. Anche Multi/Exec non funziona per quello che vuoi, prima perché non c'è rollback. Se vuoi il rollback, dovrai tirare giù entrambi gli elenchi in modo da poter ripristinare - e sperare che tra la nostra condizione di errore e il "rollback" nessun altro client abbia modificato anche nessuno degli elenchi. Farlo in modo sano e affidabile non è banale, né semplice. Probabilmente non sarebbe nemmeno una buona domanda per SO in quanto sarebbe molto ampia e non specifica per Redis.
Ora sul perché EXEC non fa quello che si potrebbe pensare. Nello scenario proposto MULTI/EXEC solo gestisce i casi di:
- Imposti gli OROLOGI per assicurarti che non siano avvenute altre modifiche
- Il tuo cliente muore prima di emettere EXEC
- Redis ha esaurito la memoria
È del tutto possibile ottenere errori come risultato dell'esecuzione del comando EXEC. Quando emetti EXEC, Redis eseguirà tutto comandi nella coda e restituisce un elenco di errori. Non fornirà il caso in cui l'aggiunta all'elenco-1 funziona e l'aggiunta all'elenco-2 non riesce. Avresti ancora i tuoi due elenchi non sincronizzati. Quando emetti, pronuncia un LPUSH dopo aver emesso MULTI, riceverai sempre un OK
a meno che tu:
- a) in precedenza ha aggiunto un orologio e qualcosa in quell'elenco è cambiato o
- b) Redis restituisce una condizione OOM in risposta a un comando push in coda
DISCARD non funziona come qualcuno potrebbe pensare. DISCARD viene utilizzato invece di EXEC, non come meccanismo di rollback. Dopo aver emesso EXEC, la transazione è completata. Redis non ha alcun meccanismo di rollback:non è di questo che tratta la transazione di Redis.
La chiave per comprendere ciò che Redis chiama transazioni è rendersi conto che sono essenzialmente una coda di comandi a livello di connessione client. Non sono una macchina a stati del database.