Redis事務:
在一個隊列(queue)中依次執(zhí)行一系列的命令。
事務的三個階段:
1.開始事務(MULTI)
2.命令加入隊列 (QUEUE)
3.執(zhí)行事務 (EXEC)
示例1:
MULTI > QUEUE > EXEC(一般情況下依次執(zhí)行隊列中所有命令)
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379>
示例2:
MULTI > QUEUE > DISCARD(取消執(zhí)行隊列中的所有命令)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379>
示例3:
MULTI > QUEUE > EXEC(QUEUE中的命令有錯誤,所有命令不執(zhí)行)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set k6
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379>
示例4:
MULTI > QUEUE > EXEC(QUEUE中的命令執(zhí)行失敗,其余命令正常執(zhí)行)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> incr k4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) OK
127.0.0.1:6379> keys *
1) "k6"
2) "k1"
3) "k2"
4) "k3"
5) "k4"
6) "k5"
127.0.0.1:6379>
示例5:
WATCH > MULTI > QUEUE > EXEC
1.如果事務執(zhí)行前WATCH的key被其他進程操作了,事務執(zhí)行失敗;
2.EXEC執(zhí)行后不管事務是否執(zhí)行成功,WATCH都會解除;
3.UNWATCH可以手動解除WATCH。
客戶端1
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> append k1 xyz
QUEUED
127.0.0.1:6379>
客戶端2
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> append k1 abc
(integer) 5
127.0.0.1:6379> get k1
"v1abc"
127.0.0.1:6379>
客戶端1
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>