Transaktionen und Watch Statement in Redis

Könnten Sie mir bitte folgendes Beispiel aus "The Little Redis Book" erklären:

Mit dem obigen Code könnten wir unseren eigenen Befehl incr nicht implementieren, da sie alle zusammen ausgeführt werden, sobald exec aufgerufen wird. Aus dem Code können wir nicht machen:

redis.multi() 
current = redis.get('powerlevel') 
redis.set('powerlevel', current + 1) 
redis.exec()

So funktionieren Redis-Transaktionen nicht. Wenn wir jedoch eine Uhr zu powerlevel hinzufügen, können wir Folgendes tun:

redis.watch('powerlevel') 
current = redis.get('powerlevel') 
redis.multi() 
redis.set('powerlevel', current + 1) 
redis.exec()

Wenn ein anderer Client den Wert von powerlevel ändert, nachdem wir watch on it aufgerufen haben, schlägt unsere Transaktion fehl. Wenn kein Client den Wert ändert, funktioniert das Set. Wir können diesen Code in einer Schleife ausführen, bis es funktioniert.

Warum können wir kein Inkrement in einer Transaktion ausführen, die nicht durch einen anderen Befehl unterbrochen werden kann? Warum müssen wir stattdessen iterieren und warten, bis niemand Wert ändertVor Transaktion beginnt?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage