English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Redis 트랜잭션은 여러 명령을 동시에 실행할 수 있으며, 다음 세 중요한 보장을 가집니다:
批量操作在发送 EXEC 명령前被放入队列缓存。
EXEC 명령을 받으면 트랜잭션 실행에 들어갑니다. 트랜잭션 내의 어떤 명령도 실패하면, 나머지 명령은 여전히 실행됩니다.
트랜잭션 실행 중 다른 클라이언트가 제출한 명령 요청은 트랜잭션 실행 명령 시퀀스에 삽입되지 않습니다.
트랜잭션은 시작부터 실행까지 다음 세 단계를 거칩니다:
트랜잭션을 시작합니다.
명령을 대기열로 등록합니다.
트랜잭션을 실행합니다.
다음은 트랜잭션의 예제로, 먼저 MULTI 트랜잭션을 시작한 후, 여러 명령을 트랜잭션에 대기열로 등록한 후, 마지막으로 EXEC 명령이 트랜잭션을 触発하여, 트랜잭션 내의 모든 명령을 동시에 실행합니다:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C"++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C"++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C"++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C"++" 3) "Programming"
단일 Redis 명령의 실행은 원자적인 것이지만, Redis는 트랜잭션에 대해 원자성을 유지하기 위한 어떠한 메커니즘도 추가하지 않았기 때문에, Redis 트랜잭션의 실행은 원자적인 것이 아닙니다.
데이터베이스 트랜잭션은 실행할 패키지된 배치 스크립트로 이해할 수 있지만, 배치 명령은 원자적인 작업이 아니며, 중간에서 실패하는 명령이 전에 수행된 명령을 되돌리거나 후속 명령을 수행하지 않게 만들지 않습니다.
이는 공식 웹사이트의 설명입니다 From redis docs on 트랜잭션:
명령어가 실패할 때라도 큐에 있는 다른 모든 명령어는 처리됩니다 – Redis는 명령어 처리를 중단하지 않습니다.
예를 들어:
redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7000> set a aaa QUEUED redis 127.0.0.1:7000> set b bbb QUEUED redis 127.0.0.1:7000> set c ccc QUEUED redis 127.0.0.1:7000> exec 1) OK 2) OK 3) OK
set b bbb에서 실패하면, set a는 성공했지만 롤백되지 않으며, set c는 계속 실행됩니다.
아래 표는 Redis 트랜잭션과 관련된 명령어를 나열합니다:
순번 | 명령어 및 설명 |
---|---|
1 | DISCARD 트랜잭션을 취소하고, 트랜잭션 블록 내의 모든 명령어를 실행하지 않습니다. |
2 | EXEC 트랜잭션 블록 내의 모든 명령어를 실행합니다. |
3 | MULTI 트랜잭션 블록의 시작을 표시합니다. |
4 | UNWATCH UNWATCH 명령어를 통해 모든 키의 모니터링을 취소합니다. |
5 | WATCH key [key ...] WATCH key [key ...]를 통해 특정(또는 여러) 키를 모니터링하면, 이 키가 트랜잭션 실행 중에 다른 명령어에 의해 변경되면 트랜잭션이 중단됩니다. |