1、Redis事務的概念:
可以一次性執行多條指令,本質上是一組指令的集合。一個事務中的所有指令都會序列化,然後按順序地串行化執行,而不會被插入其他指令。
總結說:redis事務就是一次性、順序性、排他性的執行一個隊列中的一系列指令
2、Redis事務沒有隔離級别:
批量操作在發送 EXEC 指令前被放入隊列緩存,并不會被實際執行,也就不存在事務内的查詢要看到事務裡的更新,事務外查詢不能看到。
3、Redis不保證原子性:
Redis中,單條指令是原子性執行的,但事務不保證原子性,且沒有復原。事務中任意指令執行失敗,其餘的指令仍會被執行。
4、Redis事務的三個階段:
(1)開始事務
(2)指令入隊
(3)執行事務
5、Redis事務指令
下表列出了 redis 事務的相關指令:
(1)DISCARD:取消事務,放棄執行事務塊中的所有指令
(2)EXEC:執行事務塊中的指令
(3)MULTI:标記一個事務的開始
(4)UNWATCH:取消WATCH指令對所有 key 的監視
(5)WATCH key [key...]:監視一個(或多個)key,如果在事務之前執行這個(或者這些)key被其他指令所改動,那麼事務将會被打斷。
6、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指令對變量進行監控,并開啟新的事務進行操作。
7、總結
(1) 事務提供了一種将多個指令打包,然後一次性、有序地執行的機制。
(2) 多個指令會被人隊到事務隊列中, 然後按先進先出(FIFO)的順序執行。
(3) 事務在執行過程中不會被中斷,當事務隊列中的所有指令都被執行完畢之後,事務才會結束。
(4) 帶有WATCH指令的事務會将用戶端和被監視的鍵在資料庫的watched_keys字典關聯,當鍵被修改時,程式會将所有監視被修改鍵的用戶端的REDIS_DIRTY_CAS辨別打開,服務隻有在REDIS_DIRTY_CAS辨別沒有打開時,才會執行用戶端送出的事務,否則伺服器拒絕執行事務。
(5) Redis事務不支援復原機制。
(6) Redis的事務總是具有ACID中的原子性、一緻性和隔離性,當伺服器運作在AOF持久化模式下,并且appendfsync選項的值為always時,事務也具有耐久性。
總結:
watch指令類似于樂觀鎖,在事務送出時,如果watch監控的多個KEY中任何KEY的值已經被其他用戶端更改,則使用EXEC執行事務時,事務隊列将不會被執行,同時傳回Nullmulti-bulk應答以通知調用者事務執行失敗。