redis是NOSQL數據庫,因此也存務,只是在事此事務和關係型數據庫的事務是有區別的。數據庫
在執行 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
127.0.0.1:6379> EXEC 1) OK 2) OK 3) OK 4) OK 5) "333"
通常都是命令出現錯誤。Redis 會將進入隊列失敗的事件進行記錄,在執行 EXEC
命令提交事務的時候,不會執行而且會放棄這一條事務。測試
輸入命令code
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 的內部能夠保持簡單且快速開發
watch 命令能夠監控一個或多個鍵,一旦有其中一個鍵被修改(被刪除),後面的事務就不會執行了。監控一直持續到 EXEC 命令(事務中的命令是在exec以後才執行的,因此在multi命令後能夠修改watch監控的鍵值)get
假設咱們經過watch命令在事務執行以前監控了多個Keys,假若在watch以後有任何Key的值發生了變化,exec命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知調用者事務執行失敗。
這裏能夠看到保存到數據數據庫的 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
監聽 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"
此命令表示撤銷監聽
下面的操做測試能夠看到,取消監聽後,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"