1. 事務的定義
Redis事務是一個單獨的隔離操作:事務中的所有指令都會序列化、按順序地執行。事務在執行的過程中,不會被其他用戶端發送來的指令請求所打斷。
Redis事務的主要作用就是串聯多個指令防止别的指令插隊。
2. Multi、Exec、discard
從輸入Multi指令開始,輸入的指令都會依次進入指令隊列中,但不會執行,直到輸入Exec後,Redis會将之前的指令隊列中的指令依次執行。
組隊的過程中可以通過discard來放棄組隊。
3. 錯誤處理
組隊中某個指令出現了報告錯誤,執行時整個的所有隊列都會被取消。
4. 為什麼要做成事務
5. 事務沖突
- 悲觀鎖
- 悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為别人會修改,是以每次在拿資料的時候都會上鎖,這樣别人想拿這個資料就會block直到它拿到鎖。傳統的關系型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
- 樂觀鎖
- 樂觀鎖(Optimistic Lock),顧名思義,就是很樂觀,每次去拿資料的時候都認為别人不會修改,是以不會上鎖,但是在更新的時候會判斷一下在此期間别人有沒有去更新這個資料,可以使用版本号等機制。樂觀鎖适用于多讀的應用類型,這樣可以提高吞吐量。Redis就是利用這種check-and-set機制實作事務的。
- watch key [key ...]
- 在執行multi之前,先執行watch key1 [key2],可以監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他指令所改動,那麼事務将被打斷。
- unwatch
- 取消 WATCH 指令對所有 key 的監視。如果在執行 WATCH 指令之後,EXEC 指令或DISCARD 指令先被執行了的話,那麼就不需要再執行UNWATCH 了。
6. redis 事務三特性
- 單獨的隔離操作
- 事務中的所有指令都會序列化、按順序地執行。事務在執行的過程中,不會被其他用戶端發送來的指令請求所打斷。
- 沒有隔離級别的概念
- 隊列中的指令沒有送出之前都不會實際被執行,因為事務送出前任何指令都不會被實際執行
- 不保證原子性
- n事務中如果有一條指令執行失敗,其後的指令仍然會被執行,沒有復原