sql >> Database >  >> NoSQL >> Redis

Hoe een transactie met terugdraaien in Redis te implementeren

Als u het terugdraaien van transacties nodig hebt, raad ik u aan iets anders dan Redis te gebruiken. Redis-transacties zijn niet hetzelfde als voor andere datastores. Zelfs Multi/Exec werkt niet voor wat je wilt - ten eerste omdat er geen rollback is. Als je een rollback wilt, moet je beide lijsten naar beneden halen zodat je kunt herstellen - en ik hoop dat tussen onze foutconditie en de "rollback" geen enkele andere client ook een van de lijsten heeft gewijzigd. Dit op een verstandige en betrouwbare manier doen is niet triviaal, noch eenvoudig. Het zou waarschijnlijk ook geen goede vraag zijn voor SO, omdat het erg breed zou zijn en niet specifiek voor Redis.

Nu waarom EXEC niet doet wat men zou denken. In uw voorgestelde scenario MULTI/EXEC alleen behandelt de gevallen van:

  1. U hebt WATCH's ingesteld om ervoor te zorgen dat er geen andere wijzigingen plaatsvinden
  2. Uw cliënt overlijdt voordat EXEC wordt afgegeven
  3. Redis heeft geen geheugen meer

Het is heel goed mogelijk om fouten te krijgen als gevolg van het geven van het EXEC-commando. Wanneer u EXEC uitgeeft, voert Redis alles uit commando's in de wachtrij en retourneert een lijst met fouten. Het biedt niet het geval dat de add-to-list-1 werkt en add-to-list-2 niet werkt. Je zou nog steeds je twee lijsten niet gesynchroniseerd hebben. Als u een afgifte uitvoert, zeg een LPUSH nadat u MULTI heeft uitgegeven, krijgt u altijd een OK terug tenzij je:

  • a) eerder een horloge toegevoegd en iets in die lijst is gewijzigd of
  • b) Redis retourneert een OOM-voorwaarde als reactie op een push-opdracht in de wachtrij

DISCARD werkt niet zoals sommigen misschien denken. DISCARD wordt gebruikt in plaats van EXEC, niet als een terugdraaimechanisme. Zodra u EXEC heeft uitgegeven, is uw transactie voltooid. Redis heeft helemaal geen terugdraaimechanisme - dat is niet waar de transactie van Redis over gaat.

De sleutel om te begrijpen wat Redis transacties noemt, is om te beseffen dat ze in wezen een opdrachtwachtrij zijn op het verbindingsniveau van de klant. Ze zijn geen databasestatusmachine.



  1. Wat zijn de onderliggende verschillen tussen select, epoll, kqueue en evport?

  2. MongoDB $sum en $avg van subdocumenten

  3. Specifieke velden opnemen in een wildcard-index in MongoDB

  4. MongoDB start niet na servercrash