1. 트랜잭션 종류
- HTTP 프로토콜에 대해 웹 정보 교환
- Http Request, Http Response를 하나로 묶어서 Http Transaction이라고 부른다.
- 일렬의 쿼리를 묶어서 처리하는 것
- RDB의 Transaction은 ACID라는 주요 특징을 가지고 있다.
- 데이터 정합성과 일관성을 매우 높은 수준으로 유지할 수 있다.
- Redis에서의 Transaction 또한 여러 개의 명령들에 대해 내부 큐에 모아두게 되고, 트랜잭션 완료를 전달하면 일련의 명령들을 한 번에 실행시키는 처리를 말한다.
- 트랜잭션이 완료되기 전까지는 해당 명령들은 다른 요청들과 격리되는 것이 특징이다.
- 1번 클라이언트 명령에서 key1에 대해 SET 명령어가 있더라도, 트랜잭션이 완료되지 않았다면 2번 클라이언트에서 key1을 조회하더라도 값이 조회되지 않는다.
- Redis는 트랜잭션이 종료되는 시점에 일괄 실행되기 때문에 설정한 값들을 트랜잭션 안에서 다시 조회할 수는 없다.
- 일련의 명령들 중에서 아예 잘못된 키워드(SET123)가 들어가 있다면, 트랜잭션 내 전체 명령은 모두 롤백된다.
- 다만, 인자값이 잘못된 경우에는 전체 롤백되지 않고 나머지 명령들이 처리가 되기 때문에 이러한 특성들은 잘 이해하고 사용해야 한다.
2. 트랜잭션 관련 명령어
Redis에서 트랜잭션을 관리하기 위한 명령어는 주로 MULTI, EXEC, DISCARD, WATCH로 구성된다. 이 명령어들을 사용하면 원자적으로 여러 명령을 실행하거나 조건부 트랜잭션을 처리할 수 있다.
MULTI
- 트랜잭션 블록을 시작
- 이 명령 이후에 나오는 모든 명령어들은 큐에 쌓이게되며, EXEC 명령이 실행될 때 한 번에 실행된다.
EXEC
- 트랜잭션 블록에 쌓여 있는 모든 명령어들을 한 번에 실행한다.
- 만약 WATCH 명령어로 감시하고 있는 키가 변경되었다면, 트랜잭션이 실패하고 nil을 반환한다.
DISCARD
- DISCARD 명령은 MULTI 명령 이후에 큐에 쌓여 있는 모든 명령어를 취소하고 트랜잭션 블록을 종료한다.
WATCH
- WATCH 명령은 특정 키를 감시한다.
- 트랜잭션 블록 내에서 실행되기 전에 이 키가 변경되면 트랜잭션이 실패한다.
- 이는 조건부 트랜잭션을 구현할 때 유용하다.
예제
WATCH mykey
# 트랜잭션 시작
MULTI
SET mykey 1
SET myotherkey 2
# 트랜잭션 실행
EXEC
이 예제에서 mykey가 WATCH로 감시되며, 만약 MULTI 이후 EXEC 이전에 mykey가 다른 클라이언트에 의해 변경되면, EXEC 명령이 실패한다.
실습
반응형