Transactions
여러 commands를 하나의 step으로 처리할 수 있도록 하는 기능
- MULTI, EXEC, DISCARD, WATCH 등의 커멘드 존재
Redis Transactions은 다음 두 가지를 보장
- transaction 내의 명령어는 redis에서 모두 순서대로 처리되고, 중간에 어떠한 다른 명령어도 처리되지 않는다.
- EXEC 명령어가 시작되어야지만 transaction 내의 명령어들이 시작된다.
MULTI 명령어를 통해 Transaction을 시작
그 이후 명령어를 입력하면 QUEUE에 넣어놓은 뒤, EXEC를 통해 queue에 있는 모든 명령어를 순서대로 처리
> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1
Errors
Transaction에서 에러의 종류는 두 가지
- command가 queue에 쌓이는 것이 실패하는 경우
- EXEC 커멘드가 불리기 전
- command가 실행되고 있는 도중에 에러가 나는 경우
- EXEC 커멘드가 불린 후
Redis 2.6.5 <
- command가 queue에 쌓이는 것이 실패하는 경우 Return값으로 에러를 반환
- 클라이언트에서 리턴값을 기준으로 Error handling 여부를 결정
- 그대로 EXEC 명령어를 수행하면 Queue에 쌓이지 못 한 명령어를 제외하고 나머지를 그대로 수행
Redis 2.6.5 ≥
- command가 queue에 쌓이는 것이 실패하는 경우 해당 Transaction이 전체 실패 및 EXEC 실행이 불가
command가 실행되고 있는 도중에 에러가 나는 경우에는 EXEC 명령어의 반환값으로 에러 반환
MULTI
+OK
SET a abc
+QUEUED
LPOP a
+QUEUED
EXEC
*2
+OK
-WRONGTYPE Operation against a key holding the wrong kind of value
- command가 실패되더라도 queue에 존재하던 다른 커맨드는 모두 수행된다.
redis에서는 rollback을 지원하지 않음
기본명령어
- DISCARD : 현재 수행 중인 transaction을 중단
> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"
- WATCH : 특정 key의 값이 transaction 중간에 변경된다면 해당 transaction을 수행하지 않도록 함
- WATCH 명령어와 EXEC 명령어 사이에 해당 키값이 변경되면 EXEC 수행이 안 되고, 반환으로 None값을 반환
- watched된 key는 EXEC가 호출되거나, client connection이 종료되면 unwatched된다.
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
'Redis(레디스)' 카테고리의 다른 글
| Redis Sentinel (1) | 2023.12.10 |
|---|---|
| Redis client-side caching (1) | 2023.12.10 |
| Redis pipelining (0) | 2023.12.10 |
| Redis pub/sub & redis stream과의 차이점 (1) | 2023.12.10 |
| Redis 데이터 타입 정리 (1) | 2023.12.10 |