Redis事務 MULTI、EXEC、Watch

Redis事務

[TOC]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 命令提交事務的時候,不會執行而且會放棄這一條事務。測試

輸入命令spa

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

執行結果code

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"
相關文章
相關標籤/搜索