MULTI/EXEC/DISCARD/WATCH로 여러 명령을 하나로 묶어 원자적·격리 실행하는 기능MULTI/EXEC: 명령을 큐에 모아 한 번에 실행 (원자성·격리)WATCH: 낙관적 락(CAS)으로 “읽고 판단 후 쓰기”를 안전하게QUEUED를 반환MULTI # OK
SET k1 v1 # QUEUED
INCR counter # QUEUED
EXEC # 1) OK 2) (integer) 5 ← 큐 전체를 한 번에 실행
WATCH key [key ...]: 키를 감시 대상으로 등록 (MULTI 전에 호출해야 함)UNWATCH: 모든 감시 해제 (EXEC·DISCARD 시 자동 해제됨)EXEC가 큐 전체를 하나의 작업 단위로 실행EXEC 시 실행을 거부 (EXECABORT) → 아무것도 실행 안 됨EXEC 실행 시점에야 나는 에러MULTI
SET k "hello" # QUEUED
INCR k # QUEUED (문자열에 INCR → 실행 시 에러)
LPUSH list a # QUEUED
EXEC
# 1) OK 2) (error) ... 3) (integer) 1 ← 2번이 실패해도 1·3번은 적용됨
WATCH한 키가 EXEC 전에 다른 클라이언트에 의해 변경되면 → EXEC가 nil 반환하고 큐 전체 취소EXEC가 실패 → 비관적 락(차단)이 아니라 낙관적(변경 감지 후 취소), 사실상 CAS(Compare-And-Swap)MULTI만으로는 “읽고 → 판단 → 쓰기”가 불가능
EXEC 전엔 값을 반환하지 않으므로, 읽은 값으로 분기할 수 없음WATCH와 MULTI 사이에서 하고, 그 사이 값이 안 바뀌었음을 WATCH가 보장WATCH balance # 감시 시작
cur = GET balance # 현재 값 읽기 (WATCH ~ MULTI 사이)
# 앱에서 계산·검증: new = cur - 100 (잔액 충분한지)
MULTI
SET balance <new>
EXEC # balance가 그새 바뀌었으면 nil → 처음부터 재시도
MULTI~EXEC 자체도 파이프라인으로 보내 성능을 챙김WATCH 재시도가 몰려 retry storm 발생