天天看點

Redis學習七(redis事務)

1. 事務的定義

Redis事務是一個單獨的隔離操作:事務中的所有指令都會序列化、按順序地執行。事務在執行的過程中,不會被其他用戶端發送來的指令請求所打斷。

Redis事務的主要作用就是串聯多個指令防止别的指令插隊。

2. Multi、Exec、discard

從輸入Multi指令開始,輸入的指令都會依次進入指令隊列中,但不會執行,直到輸入Exec後,Redis會将之前的指令隊列中的指令依次執行。

組隊的過程中可以通過discard來放棄組隊。

Redis學習七(redis事務)

3. 錯誤處理

組隊中某個指令出現了報告錯誤,執行時整個的所有隊列都會被取消。

Redis學習七(redis事務)

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事務中如果有一條指令執行失敗,其後的指令仍然會被執行,沒有復原

繼續閱讀