1. 程式人生 > >redis 事務(MULTI 、 EXEC 、 DISCARD 和 WATCH )

redis 事務(MULTI 、 EXEC 、 DISCARD 和 WATCH )

官方介紹MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事務相關的命令,事務可以一次執行多個命令,但是必須滿足2個條件:

  • 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。

  • 事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。執行和是否成功是2個概念,並不是一個失敗報錯等,其他就失敗。redis對事務是部分支援。如果最開始語法等就有提交錯誤,就相當於java的編譯器都過不了,那麼肯定全部不執行(見圖一)。如果在執行過程中報錯,已經全部執行了,但是誰報錯找誰,其他正常執行放行(圖二)。各取所需!這裡的事務並不是要麼全部成功,要麼全部失敗,全部執行和全部成功(或者都失敗)是2個概念。

MULTI 開啟事務,總是返回OK,EXEC 提交事務,DISCARD放棄事務(放棄提交執行),WATCH監控 QUEUED是將命令加入執行的佇列 圖一: 圖二 K1的value不是數字,執行時候報錯,其他不影響,都執行了命令 127.0.0.1:6379> set k1 k1
OK
127.0.0.1:6379> set k2 k2
OK
127.0.0.1:6379> set k3 k3
OK
127.0.0.1:6379> set k4 k4
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> set k2 22
QUEUED
127.0.0.1:6379> set k3 33
QUEUED
127.0.0.1:6379> set k4 44
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
4) "k4"
127.0.0.1:6379> get k1
"k1"
127.0.0.1:6379> get k2
"k2"
127.0.0.1:6379> get k3
"k3"
127.0.0.1:6379> get k4
"k4"
127.0.0.1:6379> 
WATCH監控:比如信用卡有100的額度,刷了20後,就欠額20,額度還有80,就需要這2次操作都在一個事務中,要麼2個都成功,要麼2個操作都失敗。 成功,保證都在一個事務中 如果中間被其他人改動了怎麼辦呢? 中途被其他人修改了,自己的事務失敗了,這個時候就需要使用UNWATCH,放棄本次監控,重新來過(重新獲值再去修改),樂觀鎖