Сравнение «транзакций» Redis с механизмом транзакций общего назначения всегда немного вводит в заблуждение.Блок Redis WATCH / MULTI / EXEC:
- Не атомарный (без отката в случае ошибки)
- Согласованный (в любом случае с Redis не так много правил согласованности)
- Полностью изолирован (все сериализировано)
- Возможно, длительно, если выбрана стратегия AOF + fsync
Таким образом, полные свойства ACID, которые обычно используются для определения транзакции, не полностьюпредоставлено Redis.В отличие от большинства транзакционных механизмов, Redis обеспечивает очень сильную изоляцию и не пытается обеспечить какие-либо возможности отката.
Пример, приведенный в этом вопросе, не является действительно репрезентативным IMO, поскольку такое же поведение может быть достигнуто в более простомпросто используя:
redis.incr ("powerlevel")
, поскольку операции Redis single всегда атомарные и изолированные.
WATCH / MULTIБлоки / EXEC обычно используются, когда необходимо обеспечить согласованность между различными ключами или для реализации оптимистических шаблонов блокировки.Другими словами, если ваша цель - просто увеличить изолированные счетчики, нет необходимости использовать блок WATCH / MULTI / EXEC.
HandlerSocket - это совершенно другой зверь.Он построен поверх универсального обработчика MySQL, и в зависимости от базового механизма хранения поведение транзакций будет различным.Например, когда он используется с MyISAM, он не будет использовать транзакции ACID, но согласованность будет обеспечиваться блокировкой R / W на уровне таблицы.С InnoDB транзакции ACID будут использоваться с уровнем изоляции по умолчанию (который может быть установлен в конфигурации AFAIK InnoDB).InnoDB реализует MVCC (управление параллельным управлением нескольких версий), поэтому блокировка намного сложнее, чем с MyISAM.
HandlerSocket работает с двумя пулами рабочих потоков (один для соединений только для чтения, другой для соединений, ориентированных на запись),Предполагается, что люди будут использовать несколько рабочих потоков для чтения, но только один поток для записи (возможно, для уменьшения конкуренции за блокировку).Таким образом, в базовой конфигурации операции записи сериализуются, а не операции чтения.AFAIK, единственная возможность иметь ту же семантику изоляции, что и в Redis, - это использовать только сокет, ориентированный на запись, для выполнения операций чтения и записи и сохранять только один поток записи (полная сериализация всех операций).Однако это повлияет на масштабируемость.
Из протокола HandlerSocket нет доступа к транзакционным возможностям.На каждой итерации цикла событий он собирает все операции (поступающие из всех сокетов) и выполняет уникальную транзакцию (относится только к InnoDB) для всех этих операций.AFAIK, пользователь не может изменить область действия этой транзакции.
Вывод состоит в том, что в общем случае невозможно эмулировать поведение блока Redis WATCH / MULTI / EXEC с помощью HandlerSocket.
Теперь вернемся к примеру, если цель состоит в том, чтобы просто последовательно увеличивать счетчики, это полностью поддерживается протоколом HandlerSocket .Например, доступны операции +/- (увеличение / уменьшение), а также U?операция (аналогично команде Redis GETSET) или +? / -?(увеличение / уменьшение, возвращение предыдущего значения).