[Back-end] Redis Trasactions

말랑이·2025년 2월 26일
0

SpringBoot

목록 보기
28/30

1. Redis Transactions

  • 트랜잭션이란 정보의 교환 및 처리의 단위
  • Redis에서 여러개의 명령어를 하나의 단위로 실행하는 기능
  • 모든 명령어가 순차적으로 실행됨 (👉🏻 원자적실행 atomic 보장)

특징

  • 여러개의 명령들을 내부 큐에 모아두고, 트랜잭션 완료를 전달하면 일련의 명령들을 한번에 실행시킴

  • 트랜잭션이 완료되기 전까지는 다른 요청들과 격리되는 것이 특징 (= isolate)

  • 잘못된 명령어 입력 시, 트랜잭션 전체가 롤백됨

  • 인자값이 잘못된 경우에는, 중간에 실패해도 롤백이 불가함

  • 인자값이 잘못된 해당 명령만 실패하고, 이미 실행된 명령은 롤백 X


2. Redis Transactions 주요 명령어

1️⃣ MULTI (트랜잭션 시작)

  • MULTI 명령어를 사용하면 트랜잭션 모드가 활성화됨
  • 이후 입력되는 명령어들은 즉시 실행되지 않고, Queue에 저장됨
  • EXEC or DISCARD를 호출하기 전까지 실행되지 않음
MULTI
	SET user:1:name "mallang"
    INCR user:1:count
EXEC

2️⃣ EXEC (트랜잭션 실행)

  • MULTI 이후 Queue에 저장된 모든 명령어를 한꺼번에 실행함
  • 실행이 시작되면 중간에 실패하더라도 롤백되지 않음
MULTI
	SET user:1:name "mallang"
    INCR user:1:count
EXEC

# user:1:name 값이 "mallang"으로 저장됨
# user:1:count 값이 1 증가함

3️⃣ DISCARD (트랜잭션 취소)

  • MULTI 상태에서 입력된 모든 명령어를 취소하고 트랜잭션 모드를 종료함
  • DISCARD가 실행되면, 트랜잭션 Queue에 있는 모든 명령어가 삭제됨
MULTI
	SET user:1:name "mallang"
    INCR user:1:count
DISCARD

# user:1:name과 user:1:count 변경없음(트랜잭션 취소)

4️⃣ WATCH (낙관적 락을 통한 동시성 제어)

  • WATCH Key를 사용하면, 해당 키가 변경되었을 경우 트랜잭션이 실행되지 않음
  • 낙관적 락 (Optimistic Lockiing) 구현
    • ex) 한 사용자가 동시에 두 개의 다른 요청을 보낼 때, 잔액이 음수가 되는 문제를 막기위해 사용
  • 트랜잭션이 사작되기 전에 사용해야 함
WATCH user:1:cash
MULTI
	DECR user:1:cash 100
EXEC

# user:1:cash 값이 다른 client에 의해 변경되면 EXEC가 실패하고 트랜잭션이 실행되지 않음

profile
🐰 I'm Sunyeon-Jeong, mallang

0개의 댓글