Транзакции и оператор наблюдения в Redis

Не могли бы вы объяснить мне следующий пример из «Маленькой книги Redis»:

С приведенным выше кодом мы не смогли бы реализовать нашу собственную увеличение команда, так как все они выполняются вместе после вызова exec. От код, мы не можем сделать:

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

Транзакции Redis работают иначе. Но если мы добавим часы к powerlevel, мы можем сделать:

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

Если другой клиент изменит значение powerlevel после того, как мы вызвали следите за этим, наша транзакция завершится неудачей. Если ни один клиент не изменит значение, набор будет работать. Мы можем выполнять этот код в цикле, пока он не работает.

Почему мы не можем выполнить инкремент в транзакции, которая не может быть прервана другой командой? Почему вместо этого нам нужно повторять и ждать, пока никто не изменит значение до начала транзакции?

31
задан Marboni 25 May 2012 в 07:54
поделиться