[Redis] Transaction

이재민·2024년 4월 13일

Redis

목록 보기
3/6

Redis Transaction

레디스는 트랜잭션을 유지하기 위해 MULTI, EXEC, DISCARD, WATCH 명령어를 지원한다.

Redis Transaction 명령어

MULTI

  • Redis의 트랜잭션을 시작하는 커맨드, 트랜잭션을 시작하면 Redis는 이후 커맨드는 바로 실행되지 않고 queue에 쌓입니다.

EXEC

  • 정상적으로 처리되어 queue에 쌓여있는 명령어를 일괄적으로 실행합니다.

DISCARD

  • queue에 쌓여있는 명령어들을 폐기합니다. Rollback의 개념과 유사합니다.

WATCH

  • Redis에서 Lock을 담당하는 명령어이면서, 낙관적 락 기반입니다.

특징

MULTI 명령어로 트랜잭션을 시작한 후 명령어들을 입력하면 Queued 됩니다.
하지만, 중간에 아예 잘못된 키워드의 명령어를 수행하게 된다면 모든 작업들이 Discard됩니다.
(error) EXECABORT Transaction discarded because of previous error. 에러 발생

반면, 인자값이 잘못된 경우 전체 롤백은 되지 않고 나머지 명령들은 처리 되기에 이러한 특징을 잘 이해해야 한다.

실습


2개의 redis-cli에 접속하여 트랜잭션 테스트

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key test
QUEUED
127.0.0.1:6379(TX)> set key2 test2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK

127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> get key
"test"
127.0.0.1:6379> get key2
"test2"

첫 번째 애플리케이션에서 exec를 실행하기 전 다른 cli에서 key를 조회하면 nil을 확인할 수 있다.
그래서 트랜잭션을 완료하기 위해 exec를 수행하였고 두 번째 애플리케이션에서 key들을 조회하여 값을 확인할 수 있다.

잘못된 명령어로 rollback 실습

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key test
QUEUED
127.0.0.1:6379(TX)> setadsd testest

(error) ERR unknown command setadsd, with args beginning with: testest,

127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.

127.0.0.1:6379> get key
(nil)

multi 명령어로 TX를 오픈한 후 잘못된 명령어를 입력하니 에러가 발생했고, exec 명령어를 수행하니 (error) EXECABORT Transaction discarded because of previous errors. 에러와 함게 rollback 된 것을 확인할 수 있다. (get하니 nil 반환)

인자값이 잘못된 경우 실습

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key test
QUEUED
127.0.0.1:6379(TX)> set key2 test2 test3
QUEUED
127.0.0.1:6379(TX)> set key3 test3
QUEUED
127.0.0.1:6379(TX)> set key4 test4 test6
QUEUED

127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR syntax error
3) OK
4) (error) ERR syntax error

set 명령어를 잘못 사용한 2개의 명령어에 대한 결과가 (error) ERR syntax error를 반환하는 것을 확인할 수 있다.

profile
문제 해결과 개선 과제를 수행하며 성장을 추구하는 것을 좋아합니다.

0개의 댓글