English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Транзакции Redis

Транзакции 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

В таблице ниже перечислены команды для транзакций в Redis:

НомерКоманды и описание
1DISCARD
Отменить транзакцию, отказаться от выполнения всех команд в блоке транзакции.
2EXEC
Выполнить все команды в блоке транзакции.
3MULTI
Маркировать начало блока транзакции.
4UNWATCH
Отменить команду WATCH для всех ключей.
5WATCH ключ [ключ ...]
Следить за одним (или несколькими) ключами, если перед выполнением транзакции этот (или эти) ключи изменены другими командами, транзакция будет прервана.