[Redis] Transaction

반응형

이번 글에서는 redis의 transaction에 대해 알아보도록 하겠습니다.

0. Transaction이란?

transaction이란 redis의 여러 command들을 하나의 block으로 모아둔 것 입니다. transaction에서 사용하는 command에는 MULTI / EXEC / DISCARD / WATCH 등이 있습니다.

redis의 transaction을 사용하면 batch 단위로 command들을 실행할 수 있습니다.

batch 단위로 처리되는 command들은 실행전에 QUEUE에 serialized 된 상태로 담겨있으며, 실행시에는 QUEUE에 삽입된 순서에 맞춰 sequentailly하게 실행됩니다. transaction은 실행되는 동안에는 어떠한 request의 영향도 받지 않습니다. 따라서 독립성을 보장합니다.

전체적인 그림으로 살펴보면 아래와 같습니다.

image.png

redis transaction의 단점으로는 roll-back 기능을 지원하지 않습니다. 따라서 transaction 내부에서 에러가 발생하더라도 전체 transaction은 roll-back되지 않으며, 에러가 발생하지 않은 command는 정상적으로 실행됩니다.

image.png

1. MULTI / EXEC

transaction을 사용하기위해선 MULTI / EXEC를 사용하면 됩니다.

먼저 transaction에 담을 command를 입력하기전에 'MULTI'를 선언합니다.

image.png

다음으로 순서대로 transaction QUEUE에 담을 command를 입력합니다. 입력한 command 구문이 정상적으로 입력된경우 QUEUE에 담김니다.

image.png

QUEUE에 담긴 command 들을 순서대로 batch로 실행하기위해 'EXEC'를 입력합니다. transaction queue에 담긴 command가 순서대로 실행되고 결과값이 순서대로 return 되는 것을 확인할 수 있습니다.

image.png

앞서 설명했듯이, transaction은 roll-back을 지원하지 않습니다. 따라서 아래와 같이 transaction을 실행하는 중간에 에러가 발생하게되면 해당 command는 error가 발생하지만 나머지 command는 정상적으로 실행됩니다.

image.png

2. DISCARD

transaction을 중단하기위해선 discard를 사용합니다.

아래와 같이 multi를 선언해 transaction을 시작한 뒤 discard를 입력하면 생성한 transaction을 중단합니다.

image.png

discard를 선언한뒤 exec를 입력해 transaction을 실행해보면 transaction이 없다는 에러가 발생합니다.

image.png

3. WATCH / UNWATCH

watch/unwatch를 이용해 key의 변경을 감지할 수 있습니다.

watch를 선언한 key는 transaction 외부에서 변경이 감지되면, 해당 key는 transaction 내부에서의 변경을 허용하지 않습니다.

예를 들어 아래와 같이 bank1에 watch를 선언한 뒤 transaction 외부에서 bank1을 변경했기 때문에, multi로 선언한 transaction 내부의 incrby bank1 100은 실행되지 않고 (nil)을 return 합니다.

image.png

watch는 watch를 선언한 클라이언트뿐만아니라 다른 client에서도 transaction 외부에서 해당 key값을 변경할 경우 동일하게 transaction 내부의 변경을 허용하지 않습니다.

image.png

한번 watch를 선언한 key는 exec가 실행되면 즉시 unwatch 상태로 변경됩니다. 직접 unwacth를 선언할 경우 watch가 선언된 모든 key를 반환합니다. 각각의 key별로 unwatch를 직접 선언할 수 없습니다.

image.png

unwatch가 선언된 이후에는 transaction 외부에서 key가 변경되었다고 하더라도 해당 key는 transaction 내부에서 변경할 수 있습니다.

image.png

watch와는 반대로 다른 client에서 선언한 unwatch는 허용하지 않습니다. 따라서 외부 client에서 unwatch를 선언했다고 하더라도 해당 key는 unwatch 되지 않습니다.

image.png


참고 자료 : https://www.udemy.com/course/redis-bootcamp-for-beginners/


추천서적

 

Redis Essentials

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Redis' 카테고리의 다른 글

[Redis] Geo  (0) 2020.08.21
[Redis] Publish/Subscribe  (0) 2020.08.20
[Redis] Sorted Set  (0) 2020.08.20
[Redis] Set  (0) 2020.08.20
[Redis] Hash  (0) 2020.08.20

댓글

Designed by JB FACTORY