Redis命令參考手冊——Transaction(事務)

Redis命令參考手冊——Transaction(事務)

1、WATCH

格式:watch key [key …]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
可用版本:

>=2.2.0

時間複雜度:
O(1)。
返回值:
總是返回 OK 。
示例代碼:

redis> WATCH lock lock_times
OK

2、UNWATCH

格式:UNwatch
取消 WATCH 命令對所有 key 的監視。 如果在執行 WATCH 命令之後, EXEC 命令或 DISCARD 命令先被執行了的話,那麼就不需要再執行 UNWATCH 了。 因爲 EXEC 命令會執行事務,因此 WATCH 命令的效果已經產生了;而 DISCARD 命令在取消事務的同時也會取消所有對 key 的監視,因此這兩個命令執行之後,就沒有必要執行UNWATCH 了。
可用版本:

>=2.2.0

時間複雜度:
O(1)。
返回值:
總是返回 OK 。
示例代碼:

redis> WATCH lock lock_times
OK
redis> UNWATCH
OK

3、MULTI

格式:multi
標記一個事務塊的開始。 事務塊內的多條命令會按照先後順序被放進一個隊列當中,最後由 EXEC 命令原子性(atomic)地執行。
可用版本:

>=1.2.0

時間複雜度:
O(1)。
返回值:
總是返回 OK 。
示例代碼:

redis> MULTI # 標記事務開始
OK
redis> INCR user_id # 多條命令按順序入隊
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC # 執行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

4、DISCARD

格式:discard
取消事務,放棄執行事務塊內的所有命令。 如果正在使用 WATCH 命令監視某個(或某些) key,那麼取消所有監視,等同於執行命令 UNWATCH 。
可用版本:

>=2.0.0

時間複雜度:
O(1)。
返回值:
總是返回 OK 。
示例代碼:

redis> MULTI
OK
redis> PING
QUEUED
redis> SET greeting "hello"
QUEUED
redis> DISCARD
OK

5、EXEC

格式:exec
執行所有事務塊內的命令。 假如某個(或某些) key 正處於 WATCH 命令的監視之下,且事務塊中有和這個(或這些)key 相關的命令,那麼 EXEC 命令只在這個(或這些) key 沒有被其他命令所改動的情況下執行並生效,否則該事務被打斷(abort)。
可用版本:

>=1.2.0

時間複雜度:
事務塊內所有命令的時間複雜度的總和。
返回值:
事務塊內所有命令的返回值,按命令執行的先後順序排列。 當操作被打斷時,返回空值 nil。
示例代碼:

# 事務被成功執行
redis> MULTI
OK
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
# 監視 key ,且事務成功執行
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "huangz"
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC
1) OK
2) (integer) 1
# 監視 key ,且事務被打斷
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "joe" # 就在這時,另一個客戶端修改了 lock_times 的值
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC # 因爲 lock_times 被修改, joe 的事務執行失敗
(nil)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章