天天看點

Redis事務7、總結

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)正常執行

Redis事務7、總結

(2)放棄事務

Redis事務7、總結

(3)若在事務隊列中存在指令性錯誤(類似于java編譯性錯誤),則執行EXEC指令時,所有指令都不會執行

Redis事務7、總結

(4)若在事務隊列中存在文法性錯誤(類似于java的1/0的運作時異常),則執行EXEC指令時,其他正确指令會被執行,錯誤指令抛出異常。

Redis事務7、總結

(5)使用watch

案例一:使用watch檢測balance,事務期間balance資料未變動,事務執行成功

Redis事務7、總結

案例二:使用watch檢測balance,在開啟事務後(标注1處),在新視窗執行标注2中的操作,更改balance的值,模拟其他用戶端在事務執行期間更改watch監控的資料,然後再執行标注1後指令,執行EXEC後,事務未成功執行。

Redis事務7、總結
Redis事務7、總結

一但執行 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應答以通知調用者事務執行失敗。

繼續閱讀