1. 程式人生 > >Redis事物

Redis事物

隔離級別 過程 edi exe 讀取 car 操作數 不能 開始

redis事物定義:

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

  》Redis事務的主要作用就是串聯多個命令防止別的命令插隊。(redis單線程的,所以不會線程搶占的情況)

  命令隊列

  multi 、exec 、discard

  》multi命令開始,後面的命令都會放入命令隊列(quenen),但是不會執行,直到執行exec命令,才會順序執行命令隊列中的命令。

  》如果想放棄組隊,通過discard命令來通知redis.

事物的錯誤處理有兩種:

  》第一種命令組隊時,報錯。在執行時,整租所有的命令都會被取消。

  》第二種是組隊時不報錯,執行時個別命令出錯。則只有報錯的命令不會執行,而其他命令正常執行,且不回滾

WATCH key [key ...]

  》在執行multi之前,先執行watch key.監視一個(或多個)key,如果執行事務之前,key被其他命令改了,那麽該事務不能執行。

UNWATCH key

  》取消監視

  註意:如果在執行 WATCH 命令之後, EXEC 命令或 DISCARD 命令先被執行了的話,那麽就不需要再執行 UNWATCH 了

兩種鎖機制:

  》悲觀鎖:當一開始操作(讀取、更改)數據時,就鎖住該數據不讓其他人操作,直到自己不再操作,才會釋放鎖。

  》樂觀鎖:操作數據時,不會鎖住資源,這樣並發性好,但是會有一個版本號,當更新時,也會更新版本號。其他人會與版本號做對比,以確保讀到的是最新的數據。

redis事務的三特性

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

  》沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在“事務內的查詢要看到事務裏的更新,在事務外查詢不能看到”這個 讓人萬分頭痛的問題 。

  》不保證原子性 :Redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾 。

Redis事物