Redis 事務指令 MULTI、EXEC、DISCARD、WATCH、UNWATCH

Redis 事務

Redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:

  • 批量操作在發送 EXEC 命令前被放入隊列緩存。
  • 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
  • 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。

一個事務從開始到執行會經歷以下三個階段:

  • 開始事務。
  • 命令入隊。
  • 執行事務。
序號 命令及描述
1 DISCARD
取消事務,放棄執行事務塊內的所有命令。
2 EXEC
執行所有事務塊內的命令。
3 MULTI
標記一個事務塊的開始。
4 UNWATCH
取消 WATCH 命令對所有 key 的監視。
5 WATCH key [key ...]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。

 

1.DISCARD用來取消一個事務;

2.EXEC用來執行一個事務;

3.MULTI用來組裝一個事務; 

4.WATCH用來監視一些key,一旦這些key在事務執行之前被改變,則取消事務的執行

5.WATCH取消 WATCH 命令對所有 key 的監視。

 

在用MULTI組裝事務時,每一個命令都會進入到內存隊列中緩存起來,如果出現QUEUED則表示我們這個命令成功插入了緩存隊列,在將來執行EXEC時,這些被QUEUED的命令都會被組裝成一個事務來執行。


1.調用EXEC之前的錯誤

有可能是由於語法有誤導致的,也可能時由於內存不足導致的。只要出現某個命令無法成功寫入緩衝隊列的情況,redis都會進行記錄,在客戶端調用EXEC時,redis會拒絕執行這一事務。

2.調用EXEC之後的錯誤

而對於“調用EXEC之後的錯誤”(入隊成功,執行出錯),redis則採取了完全不同的策略,即redis不會理睬這些錯誤,而是繼續向下執行事務中的其他命令。這是因爲,對於應用層面的錯誤,並不是redis自身需要考慮和處理的問題,所以一個事務中如果某一條命令執行失敗,並不會影響接下來的其他命令的執行。

指令“WATCH",這是一個很好用的指令,它可以幫我們實現類似於“樂觀鎖”的效果

 

 

WATCH都會盡職盡責的監視,一旦發現某個key被修改了,在執行EXEC時就會返回nil,表示事務無法觸發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章