Проектная лаборатория
Собственный Redis
Этап 72 · Оптимистическая блокировка
Снятие наблюдения при EXEC
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы проверите очистку отслеживаемых ключей после EXEC.
Очистка отслеживаемых ключей при EXEC
WATCH защищает одну транзакцию. После EXEC, независимо от успеха или отмены, состояние наблюдения соединения нужно очистить. Иначе устаревшее состояние может перейти в будущие транзакции того же соединения и вызвать ошибки по не связанным с ними причинам.
$ redis-cli
# Client A
> WATCH foo
OK
# Client B
> SET foo 100
OK
# Client A
> MULTI
OK
> SET bar 200
QUEUED
> EXEC
*-1\r\n # transaction aborted, foo was modified
# Client A starts a new transaction (no WATCH this time)
> MULTI
OK
> SET bar 200
QUEUED
> EXEC
1) OK # succeeds, previous EXEC cleared the watch stateТесты
Тестирующая программа запустит вашу программу так:
$ ./your_program.shТест создаст двух клиентов. Первый задаст два ключа, начнёт отслеживать один и откроет транзакцию:
# Client 1
> SET foo 100
OK
> SET bar 200
OK
> WATCH foo
OK
> MULTI
OK
> SET bar 300
QUEUEDВторой изменит отслеживаемый ключ:
# Client 2
> SET foo 200
OKПервый выполнит транзакцию, ожидая отмены, затем сразу начнёт и выполнит вторую:
# Client 1
> EXEC
*-1\r\n # first transaction aborted
# Client 1 starts a new transaction
> MULTI
OK
> SET bar 300
QUEUED
> EXEC
1) OK # second transaction succeeds
# Client 2
> GET bar
"300" # confirms the second transaction's write took effectБудет проверено, что:
- Первый
EXECвозвращает нулевой массив RESP (*-1\r\n), поскольку отслеживаемый ключ изменён. - Второй
EXECуспешен, поскольку первыйEXECочистил состояние наблюдения. - Команды второй транзакции применены.
Примечания
- Если вы уже очищаете состояние наблюдения после
EXEC, как предлагалось ранее, этап должен пройти без изменений. - Очистка отслеживаемых ключей при
DISCARDпоявится позже.
Проверка в вашей 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 fn4Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.