Redis事物
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事物