Redis
 sql >> Datenbank >  >> NoSQL >> Redis

So implementieren Sie Transaktionen mit Rollback in Redis

Wenn Sie ein Transaktions-Rollback benötigen, empfehle ich, etwas anderes als Redis zu verwenden. Redis-Transaktionen sind nicht dieselben wie für andere Datenspeicher. Auch Multi/Exec funktioniert nicht für das, was Sie wollen - erstens, weil es kein Rollback gibt. Wenn Sie ein Rollback wünschen, müssen Sie beide Listen herunterziehen, damit Sie sie wiederherstellen können - und hoffen, dass zwischen unserer Fehlerbedingung und dem "Rollback" kein anderer Client auch eine der Listen geändert hat. Dies auf vernünftige und zuverlässige Weise zu tun, ist weder trivial noch einfach. Es wäre wahrscheinlich auch keine gute Frage für SO, da es sehr breit und nicht Redis-spezifisch wäre.

Nun zu der Frage, warum EXEC nicht das tut, was man denken könnte. In Ihrem vorgeschlagenen Szenario MULTI/EXEC nur behandelt die Fälle von:

  1. Sie richten WATCHes ein, um sicherzustellen, dass keine anderen Änderungen vorgenommen wurden
  2. Ihr Client stirbt, bevor er EXEC ausgibt
  3. Redis hat keinen Speicher mehr

Es ist durchaus möglich, dass beim Absetzen des EXEC-Befehls Fehler auftreten. Wenn Sie EXEC ausgeben, führt Redis alle aus Befehle in der Warteschlange und geben eine Fehlerliste zurück. Es wird nicht den Fall liefern, dass das Hinzufügen zur Liste 1 funktioniert und das Hinzufügen zur Liste 2 fehlschlägt. Ihre beiden Listen wären immer noch nicht synchron. Wenn Sie einen LPUSH ausgeben, nachdem Sie MULTI ausgegeben haben, erhalten Sie immer ein OK zurück es sei denn, Sie:

  • a) zuvor eine Uhr hinzugefügt und etwas in dieser Liste geändert oder
  • b) Redis gibt eine OOM-Bedingung als Antwort auf einen Push-Befehl in der Warteschlange zurück

DISCARD funktioniert nicht so, wie manche vielleicht denken. DISCARD wird statt verwendet EXEC, nicht als Rollback-Mechanismus. Sobald Sie EXEC ausgeben, ist Ihre Transaktion abgeschlossen. Redis hat überhaupt keinen Rollback-Mechanismus - darum geht es bei der Transaktion von Redis nicht.

Der Schlüssel zum Verständnis dessen, was Redis als Transaktionen bezeichnet, besteht darin, zu erkennen, dass es sich im Wesentlichen um eine Befehlswarteschlange auf der Ebene der Clientverbindung handelt. Sie sind keine Datenbankzustandsmaschine.