Redis事務 MULTI、EXEC、Watch


Redis事務

redis是NOSQL數據庫,所以也存務,只是在事此事務和關系型數據庫的事務是有區別的。

事務實例

MULTI 命令

在執行 MULTI 命令之后,此時將進入阻塞狀態。當我們繼續發送命令時,命令不會立即執行,而是會排隊等待。直到輸入 EXEC 命令執行,隊列中的命令才會一一執行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 111
QUEUED
127.0.0.1:6379> set k2 222
QUEUED
127.0.0.1:6379> set k3 333
QUEUED
127.0.0.1:6379> set k4 444
QUEUED
127.0.0.1:6379> get k3
QUEUED

EXEC 命令

127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK
4) OK
5) "333"

事務異常

1. 進入隊列之前發生錯誤

一般都是命令出現錯誤。Redis 會將進入隊列失敗的事件進行記錄,在執行 EXEC 命令提交事務的時候,不會執行並且會放棄這一條事務。

輸入命令

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zhang
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex nan haha #故意寫錯
QUEUED
127.0.0.1:6379> set address beijing
QUEUED

執行結果

127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR syntax error
4) OK

查詢數據

127.0.0.1:6379> keys *
1) "address"
2) "name"
3) "age"
127.0.0.1:6379> get name
"zhang"
127.0.0.1:6379> get sex
(nil)
Redis 是沒有回滾操作的

Redis 命令只會因為錯誤的語法而失敗(並且這些問題不能在入隊時發現),或是命令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的命令是由編程錯誤造成的,而這些錯誤應該在開發的過程中被發現,而不應該出現在生產環境中。

因為不需要對回滾進行支持,所以 Redis 的內部可以保持簡單且快速

Watch 命令

watch 命令可以監控一個或多個鍵,一旦有其中一個鍵被修改(被刪除),后面的事務就不會執行了。監控一直持續到 EXEC 命令(事務中的命令是在exec之后才執行的,所以在multi命令后可以修改watch監控的鍵值)

假設我們通過watch命令在事務執行之前監控了多個Keys,倘若在watch之后有任何Key的值發生了變化,exec命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知調用者事務執行失敗。

執行 watch 命令,不執行 MULTI、exec

這里可以看到保存到數據數據庫的 name = zhang 被修改成了 name = li

127.0.0.1:6379> set name zhang
OK
127.0.0.1:6379> WATCH name
OK
127.0.0.1:6379> set name li
OK
127.0.0.1:6379> get name
"li"
執行 watch 命令,通知執行 MULTI、exec

使用 watch 監聽 age ,在再執行 MULTI 命令,在執行 exec 之前 age 有任何改變,都不會執行此事務

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> 

exec 執行之后,會自動執行 UNWatch 命令,撤銷監聽操作

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"

UnWatch 命令

此命令表示撤銷監聽

下面的操作測試可以看到,取消監聽后,exec 提交事務后,address 被修改了

127.0.0.1:6379> set address beijing
OK
127.0.0.1:6379> WATCH address
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> UNWATCH
QUEUED
127.0.0.1:6379> set address nanchang
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get address
"nanchang"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM