Проектная лаборатория
Собственный Redis
Этап 67 · Оптимистическая блокировка
WATCH внутри транзакции
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы реализуете MULTI и запретите вызов WATCH внутри транзакции.
Транзакции Redis
Ранее вы видели, как WATCH участвует в общей последовательности: начать следить за ключом, открыть транзакцию через MULTI, поставить команды в очередь и выполнить их через EXEC. Теперь начнём реализацию транзакций.
Транзакции Redis позволяют клиентам выполнять несколько команд как одну операцию. Основная последовательность:
MULTI— перейти в режим транзакции: команды ставятся в очередь вместо немедленного выполнения.SET key value,INCR counterи другие — поставить команды в очередь.EXEC— выполнить все команды очереди.
EXEC появится позже. Сейчас вы реализуете MULTI и проверку в WATCH, не вызвана ли она внутри транзакции.
Команда MULTI
Команда MULTI начинает транзакцию.
$ redis-cli MULTI
OKПри вызове MULTI сервер:
- Помечает соединение как находящееся в транзакции.
- Возвращает
OKпростой строкой.
Обновлённая команда WATCH
WATCH должна вызываться до начала транзакции. Внутри транзакции она запрещена, поскольку транзакция уже началась и команды уже помещаются в очередь.
Теперь, когда состояние транзакции хранится, WATCH должна соблюдать это правило:
- Если соединение вне транзакции:
- Добавить ключ в набор отслеживаемых ключей соединения.
- Вернуть
OKпростой строкой.
- Если соединение внутри транзакции (после
MULTI):- Вернуть ошибку RESP вида
-ERR WATCH inside MULTI is not allowed\r\n. Точная формулировка может отличаться, но должна содержатьERR,WATCH,inside MULTIиnot allowed.
- Вернуть ошибку RESP вида
Например:
$ redis-cli
> WATCH counter
OK
> MULTI
OK
(TX)> WATCH another_key
(error) ERR WATCH inside MULTI is not allowedТесты
Тестирующая программа запустит вашу программу так:
$ ./your_program.shЗатем создаст клиента, начнёт транзакцию через MULTI и отправит WATCH со случайным ключом:
$ redis-cli
> MULTI
OK
> WATCH key
(error) ERR WATCH inside MULTI is not allowedБудет проверено, что:
MULTIвозвращаетOKпростой строкой.WATCHвнутри транзакции возвращает ошибку RESP, содержащуюERR,WATCH,inside MULTIиnot allowed.
Примечания
- Понадобится хранить состояние отдельно для каждого соединения, например в отображении с ключом-соединением или сокетом.
- При вызове
WATCHвне транзакции сохраняйте отслеживаемые ключи, хотя они пока не используются. Это подготовка к следующим этапам. - Формат сообщения об ошибке может отличаться, если содержит обязательные ключевые слова.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init redis ./my-redis --language go2. Откройте папку в IDE
cd ./my-redisРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage jq9Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.