DISCARD
取消事務,放棄執行事務塊內的所有命令。
如果正在使用 WATCH 命令監視某個(或某些) key,那麼取消所有監視,等同於執行命令 UNWATCH 。
可用版本:
2.0.0+
時間複雜度:
O(1)。
傳回值:
總是返回 OK 。
redis> MULTIOKredis> PINGQUEUEDredis> SET greeting "hello"QUEUEDredis> DISCARDOK
EXEC
執行所有事務塊內的命令。
假如某個(或某些) key 正處於 WATCH 命令的監視之下,且事務塊中有和這個(或這些) key 相關的命令,那麼 EXEC 命令只在這個(或這些) key 沒有被其他命令所改動的情況下執行並生效,否則該事務被打斷(abort)。
可用版本:
1.2.0+
時間複雜度:
事務塊內所有命令的時間複雜度的總和。
傳回值:
事務塊內所有命令的傳回值,按命令執行的先後順序排列。
當操作被打斷時,返回空值 nil 。
事務被成功執行
redis> MULTIOKredis> INCR user_idQUEUEDredis> INCR user_idQUEUEDredis> INCR user_idQUEUEDredis> PINGQUEUEDredis> EXEC1) (integer) 12) (integer) 23) (integer) 34) PONG
監視 key ,且事務成功執行
redis> WATCH lock lock_timesOKredis> MULTIOKredis> SET lock "huangz"QUEUEDredis> INCR lock_timesQUEUEDredis> EXEC1) OK2) (integer) 1
監視 key ,且事務被打斷
redis> WATCH lock lock_timesOKredis> MULTIOKredis> SET lock "joe" # 就在這時,另一個用戶端修改了 lock_times 的值,concurrentModifyedQUEUEDredis> INCR lock_timesQUEUEDredis> EXEC # 因為 lock_times 被修改, joe 的事務執行失敗(nil)
MULTI
標記一個事務塊的開始。
事務塊內的多條命令會按照先後順序被放進一個隊列當中,最後由 EXEC 命令原子性(atomic)地執行。
可用版本:
1.2.0+
時間複雜度:
O(1)。
傳回值:
總是返回 OK 。
redis> MULTI # 標記事務開始OKredis> INCR user_id # 多條命令按順序入隊QUEUEDredis> INCR user_idQUEUEDredis> INCR user_idQUEUEDredis> PINGQUEUEDredis> EXEC # 執行1) (integer) 12) (integer) 23) (integer) 34) PONG
UNWATCH
取消 WATCH 命令對所有 key 的監視。
如果在執行 WATCH 命令之後, EXEC 命令或 DISCARD 命令先被執行了的話,那麼就不需要再執行 UNWATCH 了。
因為 EXEC 命令會執行事務,因此 WATCH 命令的效果已經產生了;而 DISCARD 命令在取消事務的同時也會取消所有對 key 的監視,因此這兩個命令執行之後,就沒有必要執行 UNWATCH 了。
可用版本:
2.2.0+
時間複雜度:
O(1)
傳回值:
總是 OK 。
redis> WATCH lock lock_timesOKredis> UNWATCHOK
WATCH key [key …]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
可用版本:
2.2.0+
時間複雜度:
O(1)。
傳回值:
總是返回 OK 。
redis> WATCH lock lock_times
OK