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)正常執行
(2)放棄事務
(3)若在事務隊列中存在命令性錯誤(相似於java編譯性錯誤),則執行EXEC命令時,全部命令都不會執行
(4)若在事務隊列中存在語法性錯誤(相似於java的1/0的運行時異常),則執行EXEC命令時,其餘正確命令會被執行,錯誤命令拋出異常。
(5)使用watch
案例一:使用watch檢測balance,事務期間balance數據未變更,事務執行成功
案例二:使用watch檢測balance,在開啓事務後(標註1處),在新窗口執行標註2中的操做,更改balance的值,模擬其餘客戶端在事務執行期間更改watch監控的數據,而後再執行標註1後命令,執行EXEC後,事務未成功執行。
一但執行 EXEC 開啓事務的執行後,不管事務使用執行成功, WARCH 對變量的監控都將被取消。
故當事務執行失敗後,需從新執行WATCH命令對變量進行監控,並開啓新的事務進行操做。
總結:
watch指令相似於樂觀鎖,在事務提交時,若是watch監控的多個KEY中任何KEY的值已經被其餘客戶端更改,則使用EXEC執行事務時,事務隊列將不會被執行,同時返回Nullmulti-bulk應答以通知調用者事務執行失敗。