ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed
RedisЧто это значит?
WATCH отправлен внутри открытого блока MULTI. Для оптимистической блокировки WATCH должен поставить ключи под наблюдение ДО начала транзакции; вызов после MULTI отклоняется. Ошибка не прерывает транзакцию; завершается ошибкой только WATCH, и ничего не отслеживается.
Почему возникает?
WATCH и MULTI записаны в коде в обратном порядке (сначала MULTI, затем WATCH); вызов WATCH внутри обёртки конвейера/транзакции клиентской библиотеки; либо использование соединения из пула, оставшегося в состоянии MULTI. В этом случае EXEC выполняется, даже если ключи, которые должны были отслеживаться, изменились; ожидаемая защита от конфликтов не срабатывает.
Как исправить
Правильный порядок: WATCH key -> (чтение значений) -> MULTI -> команды -> EXEC. Если EXEC возвращает nil, отслеживаемый ключ изменился; повторите операцию с начала. Используйте API WATCH/транзакций клиентской библиотеки (например, помощники watch + pipeline). Примечание: команды pub/sub, такие как SUBSCRIBE, внутри MULTI не отклоняются; они ставятся в очередь, и после EXEC соединение переходит в режим подписки; это тоже не рекомендуется — используйте для pub/sub выделенное соединение.
Ещё по этой СУБД
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range
- ERR Protocol error: invalid multibulk lengthProtocol error: invalid multibulk length
- ERR Number of keys can't be greater than number of argsEVAL/EVALSHA: numkeys exceeds argument count
- ERR WAIT cannot be used with replica instancesWAIT cannot be used with replica instances
- ERR Background append only file rewriting already in progressAOF rewrite already in progress
- IOERR error or timeout reading from target instanceMIGRATE: I/O error or timeout to target
- ERR Error compiling script (new function)Error compiling Lua script