DBAtlas · Атлас эксплуатации баз данных

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 выделенное соединение.

Открыть в DBAtlas →

Ещё по этой СУБД