TIL

07. Redis Transaction

핵심 명령

MULTI

EXEC

MULTI            # OK
SET k1 v1        # QUEUED
INCR counter     # QUEUED
EXEC             # 1) OK  2) (integer) 5   ← 큐 전체를 한 번에 실행

DISCARD

WATCH / UNWATCH

원자성과 격리

에러 처리와 롤백 없음

큐잉 단계 에러 → 트랜잭션 전체 취소

실행 단계 에러 → 나머지는 그대로 실행

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 — 낙관적 락 (CAS)

왜 WATCH가 필요한가

표준 CAS 패턴

WATCH balance            # 감시 시작
cur = GET balance        # 현재 값 읽기 (WATCH ~ MULTI 사이)
# 앱에서 계산·검증: new = cur - 100 (잔액 충분한지)
MULTI
SET balance <new>
EXEC                     # balance가 그새 바뀌었으면 nil → 처음부터 재시도

트랜잭션 ≠ 파이프라이닝

한계

참고