EXEC
執行所有事務塊內的命令。
假如某個(或某些) key 正處于?WATCH?命令的監視之下,且事務塊中有和這個(或這些) key 相關的命令,那么EXEC?命令只在這個(或這些) key 沒有被其他命令所改動的情況下執行并生效,否則該事務被打斷(abort)。
- 返回值:
- 事務塊內所有命令的返回值,按命令執行的先后順序排列。當操作被打斷時,返回空值?
nil
?。# 監視 key ,且事務成功執行 127.0.0.1:6379> get key
"111"
127.0.0.1:6379> watch key
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key 222
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get key
"222"
127.0.0.1:6379> # 監視 key ,且事務被打斷127.0.0.1:6379> set key 222
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get key
"222"
127.0.0.1:6379> watch key
OK
127.0.0.1:6379> set key 333
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key 444
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get key
"333"
------------------
在同一個客戶端下 只要在watch之后,multi執行之前改變key的值,則將以改變后的值為當前的key值,之后事務中執行關于改變key值的操作將不再生效.
在不同客戶端下,例如在a客戶端執行watch key 然后執行multi .這時在b客戶端下重新set key 值,再回到a客戶端,也重新設置另一個set key 值,這時exec后將返回為空值,最終key值為b客戶端下設定的值.
理論上來說將會以a客戶端在事務中最后設置的值為最終值,但是a客戶端會認為b客戶端在multi之前執行的值,此后a客戶端執行便返回為空.