English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Транзакции Redis могут выполнять несколько команд за один раз и обеспечивают следующие три важных гарантии:
Пакетные операции помещаются в кэш очереди перед отправкой команды EXEC.
После получения команды EXEC enters the transaction execution phase, if any command in the transaction fails, the remaining commands are still executed.
В процессе выполнения транзакции запросы команд других клиентов не добавляются в последовательность команд выполнения транзакции.
Транзакция проходит через следующие три этапа:
Начать транзакцию.
Команды добавляются в очередь.
Выполнить транзакцию.
Вот пример транзакции, которая сначала MULTI Начать транзакцию, затем добавить несколько команд в очередь транзакции, в конце EXEC Команда запускает транзакцию, все команды в транзакции выполняются вместе:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Мастеринг C++ за 21 день" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Программирование" "Мастеринг Серии" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Мастеринг C++ за 21 день" 3) (integer) 3 4) 1) "Мастеринг Серии" 2) "C++" 3) "Программирование"
Выполнение отдельной команды Redis является атомарным, но Redis не добавляет никаких механизмов поддержания атомарности в транзакциях, поэтому выполнение транзакций Redis не является атомарным.
Транзакцию можно понять как打包ированную партию выполнения скрипта, но партиями команд не являются атомарными операциями, сбой某一个 команды не возвращает ранее выполненные команды, и не предотвращает выполнение последующих команд.
Это описание с официального сайта Из документации Redis транзакции:
Следует отметить, что даже если команда не удалась, все другие команды в очереди обрабатываются – Redis не останавливает обработку команд.
Например:
redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7000> set a aaa QUEUED redis 127.0.0.1:7000> set b bbb QUEUED redis 127.0.0.1:7000> set c ccc QUEUED redis 127.0.0.1:7000> exec 1) OK 2) OK 3) OK
Если失败了 set b bbb, то set a успешно выполнено и не будет откатано, а set c продолжит выполняться.
В таблице ниже перечислены команды для транзакций в Redis:
Номер | Команды и описание |
---|---|
1 | DISCARD Отменить транзакцию, отказаться от выполнения всех команд в блоке транзакции. |
2 | EXEC Выполнить все команды в блоке транзакции. |
3 | MULTI Маркировать начало блока транзакции. |
4 | UNWATCH Отменить команду WATCH для всех ключей. |
5 | WATCH ключ [ключ ...] Следить за одним (или несколькими) ключами, если перед выполнением транзакции этот (или эти) ключи изменены другими командами, транзакция будет прервана. |