Pokud potřebujete vrácení transakcí, doporučuji použít něco jiného než Redis. Transakce Redis nejsou stejné jako u jiných datových úložišť. Dokonce ani Multi/Exec nefunguje pro to, co chcete – zaprvé proto, že neexistuje žádný rollback. Pokud chcete vrátit zpět, budete muset stáhnout oba seznamy, abyste je mohli obnovit - a doufat, že mezi naším chybovým stavem a "rollbackem" žádný jiný klient také nezměnil žádný ze seznamů. Dělat to rozumným a spolehlivým způsobem není triviální ani jednoduché. Také by to pravděpodobně nebyla dobrá otázka pro SO, protože by byla velmi široká a nebyla by specifická pro Redis.
Nyní k tomu, proč EXEC nedělá to, co by si někdo mohl myslet. Ve vámi navrhovaném scénáři MULTI/EXEC pouze řeší případy:
- Nastavili jste WATCH, abyste zajistili, že nenastanou žádné další změny
- Váš klient zemře před vydáním EXEC
- Redis nemá dostatek paměti
Je zcela možné získat chyby v důsledku vydání příkazu EXEC. Když vydáte EXEC, Redis spustí vše příkazy ve frontě a vrátí seznam chyb. Neposkytne případ selhání funkce add-to-list-1 a add-to-list-2. Stále byste měli své dva seznamy nesynchronizované. Když vydáte, řekněme LPUSH po vydání MULTI, vždy dostanete zpět OK
pokud:
- a) dříve přidali hodinky a něco v tomto seznamu se změnilo nebo
- b) Redis vrátí podmínku OOM jako odpověď na příkaz push ve frontě
DISCARD nefunguje, jak by si někteří mohli myslet. DISCARD se používá namísto EXEC, nikoli jako mechanismus vrácení zpět. Jakmile vydáte EXEC, vaše transakce je dokončena. Redis nemá vůbec žádný mechanismus vrácení zpět – o tom transakce Redis není.
Klíčem k pochopení toho, co Redis nazývá transakce, je uvědomit si, že jde v podstatě o frontu příkazů na úrovni klientského připojení. Nejsou stavovým strojem databáze.