Redis詳解(三)——事務

Redis詳解(三)——事務

Redis事務的概念:java

  Redis 事務的本質是一組命令的集合。事務支持一次執行多個命令,一個事務中全部命令都會被序列化。在事務執行過程,會按照順序串行化執行隊列中的命令,其餘客戶端提交的命令請求不會插入到事務執行命令序列中。redis

  總結說:redis事務就是一次性、順序性、排他性的執行一個隊列中的一系列命令。  緩存

Redis事務沒有隔離級別的概念:blog

  批量操做在發送 EXEC 命令前被放入隊列緩存,並不會被實際執行,也就不存在事務內的查詢要看到事務裏的更新,事務外查詢不能看到。隊列

Redis不保證原子性:事務

  Redis中,單條命令是原子性執行的,但事務不保證原子性,且沒有回滾。事務中任意命令執行失敗,其他的命令仍會被執行。編譯

Redis事務的三個階段:監控

  • 開始事務
  • 命令入隊
  • 執行事務

Redis事務相關命令:變量

  watch key1 key2 ... : 監視一或多個key,若是在事務執行以前,被監視的key被其餘命令改動,則事務被打斷 ( 相似樂觀鎖 )序列化

  multi : 標記一個事務塊的開始( queued )

  exec : 執行全部事務塊的命令 ( 一旦執行exec後,以前加的監控鎖都會被取消掉 ) 

  discard : 取消事務,放棄事務塊中的全部命令

  unwatch : 取消watch對全部key的監控

Redis事務使用案例:

(1)正常執行

img

(2)放棄事務

img

(3)若在事務隊列中存在命令性錯誤(相似於java編譯性錯誤),則執行EXEC命令時,全部命令都不會執行

img

(4)若在事務隊列中存在語法性錯誤(相似於java的1/0的運行時異常),則執行EXEC命令時,其餘正確命令會被執行,錯誤命令拋出異常。

img

(5)使用watch

案例一:使用watch檢測balance,事務期間balance數據未變更,事務執行成功

img

案例二:使用watch檢測balance,在開啓事務後(標註1處),在新窗口執行標註2中的操做,更改balance的值,模擬其餘客戶端在事務執行期間更改watch監控的數據,而後再執行標註1後命令,執行EXEC後,事務未成功執行。

img

img

一但執行 EXEC 開啓事務的執行後,不管事務使用執行成功, WARCH 對變量的監控都將被取消。

故當事務執行失敗後,需從新執行WATCH命令對變量進行監控,並開啓新的事務進行操做。

總結:

  watch指令相似於樂觀鎖,在事務提交時,若是watch監控的多個KEY中任何KEY的值已經被其餘客戶端更改,則使用EXEC執行事務時,事務隊列將不會被執行,同時返回Nullmulti-bulk應答以通知調用者事務執行失敗。

相關文章
相關標籤/搜索