Транзакции Redis

Транзакции Redis могут выполнять несколько команд одновременно и предоставляют следующие три важные гарантии:

  • Массовые операции помещаются в очередь-кэш перед отправкой команды EXEC.
  • После получения команды EXEC транзакция переходит к выполнению. Если какая-либо команда в транзакции завершается неудачно, остальные команды всё равно выполняются.
  • Во время выполнения транзакции запросы команд, отправленные другими клиентами, не будут вставлены в последовательность команд, выполняемых в транзакции.

Транзакция проходит следующие три этапа от начала до выполнения:

  • Начало транзакции.
  • Постановка команд в очередь.
  • Выполнение транзакции.

Пример

Ниже приведён пример транзакции. Сначала она используетMULTI, чтобы начать транзакцию, затем помещает несколько команд в очередь транзакции и, наконец, использует командуEXEC, чтобы запустить транзакцию, выполняя все команды в транзакции вместе:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

Выполнение отдельной команды 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 key [key ...]
Отслеживает один (или несколько) ключей. Если эти ключи будут изменены другими командами до выполнения транзакции, транзакция будет прервана.
Другие расширения