Ако имате нужда от връщане на транзакцията, препоръчвам да използвате нещо различно от Redis. Redis транзакциите не са същите като при други хранилища за данни. Дори Multi/Exec не работи за това, което искате - първо, защото няма връщане назад. Ако искате връщане назад, ще трябва да издърпате и двата списъка, за да можете да възстановите - и се надяваме, че между нашето условие за грешка и "връщането" никой друг клиент също не е променил нито един от списъците. Да направите това по разумен и надежден начин не е тривиално, нито просто. Също така вероятно няма да е добър въпрос за SO, тъй като би бил много широк, а не специфичен за Redis.
Сега относно това защо EXEC не прави това, което човек може да си помисли. В предложения от вас сценарий MULTI/EXEC само обработва случаите на:
- Настройвате ЧАСОВНИЦИ, за да сте сигурни, че няма други промени
- Вашият клиент умира, преди да издаде EXEC
- Паметта на Redis липсва
Напълно е възможно да се получат грешки в резултат на издаване на командата EXEC. Когато издадете EXEC, Redis ще изпълни всички команди в опашката и връща списък с грешки. Той няма да осигури случая на add-to-list-1 да работи и add-to-list-2 не работи. Двата си списъка все още ще не са синхронизирани. Когато издадете, кажете LPUSH след издаване на MULTI, винаги ще получите OK
освен ако не:
- a) по-рано добавен часовник и нещо в този списък се промени или
- b) Redis връща условие OOM в отговор на команда за натискане на опашка
DISCARD не работи, както някои си мислят. DISCARD се използвавместо EXEC, а не като механизъм за връщане назад. След като издадете EXEC, вашата транзакция е завършена. Redis изобщо няма механизъм за връщане назад – транзакцията на Redis не е за това.
Ключът към разбирането на това, което Redis нарича транзакции, е да се осъзнае, че те са по същество командна опашка на ниво клиентска връзка. Те не са машина за състояние на базата данни.