Transakcje i oświadczenie obserwacyjne w Redis
Czy możesz mi wyjaśnić następujący przykład z „The Little Redis Book”:
Z powyższym kodem nie bylibyśmy w stanie zaimplementować naszego własnego polecenia incr, ponieważ wszystkie są wykonywane razem po wywołaniu exec. Z kodu nie możemy zrobić:
redis.multi()
current = redis.get('powerlevel')
redis.set('powerlevel', current + 1)
redis.exec()
Nie tak działają transakcje Redis. Ale jeśli dodamy zegarek do powerlevel, możemy zrobić:
redis.watch('powerlevel')
current = redis.get('powerlevel')
redis.multi()
redis.set('powerlevel', current + 1)
redis.exec()
Jeśli inny klient zmieni wartość powerlevel po wywołaniu go, nasza transakcja zakończy się niepowodzeniem. Jeśli żaden klient nie zmieni wartości, zestaw będzie działać. Możemy wykonać ten kod w pętli, dopóki nie zadziała.
Dlaczego nie możemy wykonać przyrostu w transakcji, której nie można przerwać innym poleceniem? Dlaczego musimy zamiast tego iterować i czekać, aż nikt nie zmieni wartościprzed zaczyna się transakcja?