2016-09-20 3 views
0

Моя программа должна добавить данные в два списка в Redis как транзакцию. Данные должны быть согласованными в обоих списках. Если есть исключение или системный сбой и, таким образом, программа только добавляет данные в один список, система должна иметь возможность восстановления и отката. Но на основе документа Redis он не поддерживает откаты. Как я могу это реализовать? Я использую язык Java.Как реализовать транзакцию с откатом в Redis

ответ

0

Редис сделки разные. Это гарантирует две вещи.

  1. Все или ни одна из команд не выполняются
  2. последовательные и непрерывные команды

Сказав, что, если у вас есть контроль над кодом и знать, когда сбой системы будет происходить (какой-то извлечения исключения), вы можете достичь своего требования таким образом.

  1. MULTI -> Начать сделка
  2. LPUSH queue1 1 -> толкая в очереди 1
  3. LPUSH queue2 1 -> толкая в очереди 2
  4. EXEC/ВЫБРАСЫВАЙТЕ

В 4 step сделать EXEC, если нет ошибки, если вы столкнулись с ошибкой или исключением, и вы хотите откат сделать DISCARD.

Надеюсь, что это имеет смысл.

2

Если вам нужен откат транзакций, я рекомендую использовать что-то другое, кроме Redis. Операции Redis - это не то же самое, что и для других хранилищ данных. Даже Multi/Exec не работает для того, что вы хотите - во-первых, потому что нет отката. Если вы хотите откат, вам придется вытащить оба списка, чтобы вы могли восстановить - и надеемся, что между нашим условием ошибки и «откатом» ни один другой клиент также не изменил ни один из списков. Выполнение этого разумным и надежным способом не является тривиальным и простым. Вероятно, это тоже не был бы хорошим вопросом для SO, поскольку он был бы очень широким, а не специфичным для Redis.

Теперь о том, почему EXEC не делает то, что можно подумать. В вашем предложен сценарий MULTI/EXEC только обрабатывает случаи:

  1. Вы создали часы, чтобы гарантировать, что никакие другие изменения не произошло
  2. Ваш клиент умирает до выдачи EXEC
  3. Redis это из памяти

Вполне возможно получить ошибки в результате выдачи команды EXEC. Когда вы выдаете EXEC, Redis выполнит все команды в очереди и вернет список ошибок. Он не будет содержать случая, когда работающий и добавленный к списку список 2 не работает. У вас по-прежнему будут отсутствовать синхронизация ваших двух списков.Когда вы выдаете, скажем, LPUSH после выдачи MULTI, вы всегда получите обратно OK, если только вы:

  • а) ранее добавил часы и что-то в этом списке изменен или
  • б) Redis возвращает состояние ООГО в ответ на команду push queued

DISCARD не работает, как некоторые могут подумать. DISCARD используется вместо EXEC, а не как механизм отката. После того, как вы выдадите EXEC, ваша транзакция будет завершена. У Redis вообще нет механизма отката - это не то, что касается транзакции Redis.

Ключом к пониманию того, что Redis называет транзакциями, является осознание того, что они по сути являются командной очередью на уровне клиентского соединения. Они не являются конечным автоматом базы данных.

Смежные вопросы