首先我們來簡單介紹下redis事務的本質:
Redis 事務的本質是一組指令的集合。事務支援一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會依照順序串列化執行佇列中的命令,其他客戶端提交的命令請求不會插入到交易執行命令序列中。
總結說:redis事務就是一次性、順序性、排他性的執行一個佇列中的一系列命令。
Redis交易沒有隔離等級的概念:
批次操作在發送EXEC 指令前被放入佇列緩存,並不會被實際執行,也就不存在事務內的查詢要看到事務裡的更新,事務外查詢不能看到。
Redis不保證原子性:
Redis中,單一指令是原子性執行的,但事務不保證原子性,且沒有回滾。事務中任意指令執行失敗,其餘的指令仍會被執行。
Redis事務的三個階段:
開始事務命令入隊執行事務
Redis事務相關命令:
watch key1 key2 ... :監視一或多個key,如果在事務執行之前,被監視的key被其他命令改動,則事務被打斷( 類似樂觀鎖)
multi : 標記一個事務塊的開始( queued )
exec : 執行所有事務區塊的命令( 一旦執行exec後,先前加的監控鎖定都會被取消掉)
discard : 取消事務,放棄事務區塊中的所有指令
unwatch : 取消watch對所有key的監控
Redis事務使用案例:
(1)正常執行
( 2)放棄交易
(學習影片分享:redis影片教學)
(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應答以通知呼叫者事務執行失敗。
相關推薦:redis資料庫教學
以上是redis事務使用案例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!