Redis事務

Redis是否支持“事務”?

答:部分支持、因爲Redis不保證原子性,即redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾

但在加入隊列時候報錯的話 整個事務都不會執行。

 

事務:

可以一次執行多個命令,本質是一組命令的集合。一個事務中的

所有命令都會序列化,按順序地串行化執行而不會被其它命令插入,不許加塞

 

常用命令:

DISCARD

放棄事務 放棄執行所有命令

EXEC

執行所有任務塊內的命令

MULTI

標記一個事務的開始

UNWATCH

取消命令對所有key的監視

WATCH key …

監視一個或多個key,如果在執行之前這個key被改動 ,那麼事務將被打斷

 

 

全體連坐情況:

有一個命令在加入隊列時失敗  EXEC就會失敗,如 語法錯誤 不給參數等

誰錯誰出異常情況:

命令成功加入隊列,但在執行的時候出了異常,如incr一個非數字

 

 

樂觀鎖:每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖

      如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖

悲觀鎖:每次去拿數據的時候都認爲別人不會修改,所以不會上鎖

      樂觀鎖策略:提交版本必須大於記錄當前版本才能執行更新

 

Watch監控:

Watch指令,類似樂觀鎖,事務提交時,如果Key的值已被別的客戶端改變,

比如某個list已被別的客戶端push/pop過了,整個事務隊列都不會被執行

通過WATCH命令在事務執行之前監控了多個Keys,倘若在WATCH之後有任何Key的值發生了變化,

EXEC命令執行的事務都將被放棄,同時返回Nullmulti-bulk應答以通知調用者事務執行失敗

 

PS:一旦執行了exec之前加的監控鎖都會被取消掉了

 

 

事務三階段:開啓(MULTI)、入隊(QUEUE)、執行(EXEC)

事務三特性:

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

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

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章