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同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾