Redis
 sql >> Database >  >> NoSQL >> Redis

Come implementare la transazione con rollback in Redis

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:

  1. Imposti gli OROLOGI per assicurarti che non siano avvenute altre modifiche
  2. Il tuo cliente muore prima di emettere EXEC
  3. 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.