Транзакции 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:
| Нет. | Команда и описание |
|---|---|
| 1 | DISCARD Отменяет транзакцию и отбрасывает все команды в блоке транзакции. |
| 2 | EXEC Выполняет все команды в блоке транзакции. |
| 3 | MULTI Помечает начало блока транзакции. |
| 4 | UNWATCH Отменяет отслеживание всех ключей, установленное командой WATCH. |
| 5 | WATCH key [key ...] Отслеживает один (или несколько) ключей. Если эти ключи будут изменены другими командами до выполнения транзакции, транзакция будет прервана. |