分布式内存数据库--Redis事务
一、 事務:
與關系型數據庫一樣redis也支持事務。也就是可以一次執行多個命令,本質是一組命令的集合。一個事務中的所有命令都會序列化,按順序地串行化執行而不會被其它命令插入,不許加塞。
二、 事務能干嘛?
一個隊列中,一次性、順序性、排他性的執行一系列命令。
三、 redis事務支持的命令
1、 MULTI:標記一個事務塊的開始。 隨后的指令將在執行EXEC時作為一個原子執行。
2、 EXEC:執行事務中所有在排隊等待的指令并將鏈接狀態恢復到正常 當使用WATCH 時,只有當被監視的鍵沒有被修改,且允許檢查設定機制時,EXEC會被執行。
3、 DISCARD:刷新一個事務中所有在排隊等待的指令,并且將連接狀態恢復到正常。如果已使用WATCH,DISCARD將釋放所有被WATCH的key。
4、 WATCH:標記所有指定的key 被監視起來,在事務中有條件的執行(樂觀鎖)。
事務可以一次執行多個命令, 并且帶有以下兩個重要的保證:
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。
四、 redis事務的操作
1、 正常執行
使用MULTI開啟一個事務,每當添加一個命令,將該命令加入隊列,使用EXEC命令提交時全部執行。
2、 放棄事務
使用命令DISCARD取消事務。
3、 全體連坐
全體連坐的意思就是在一個事務中有一條語句語法有錯誤就會導致這條事務全部失效。
命令出錯,所有的命令失效。
4、 冤頭債主
意思就是在所有的命令均為正確的情況下,其中一條命令沒有拿到數據,而導致該條數據為空,但是其他命令還是會執行成功。
K99不存在,但是其他的命令還是執行成功。
5、 WATCH操作
WATCH用于監控鍵是否發生改變。被 WATCH 的鍵會被監視,并會發覺這些鍵是否被改動過了。 如果有至少一個被監視的鍵在 EXEC 執行之前被修改了, 那么整個事務都會被取消, EXEC 返回nil-reply來表示事務已經失敗。
悲觀鎖:
每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖:
每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量。
WATCH使用的是樂觀鎖策略。
一旦執行了exec之前加的監控鎖都會被取消掉了。或者使用unwatch取消監控。
小結
1、WATCH類似于樂觀鎖,在事務提交時,如果key的值已被別的客戶端改變,整個事務隊列都不會執行。
2、通過WATCH命令在事務執行之前監控了多個keys,若在WATCH之后key的值發生了變化,EXEC命令執行的事務將被放棄。
3、事務的三階段
開啟–MULTI,入隊,執行-EXEC。
4、事務的三特性
單獨隔離操作、沒有隔離級別的概念、不保證原子性(執行失敗、集體連坐、冤頭債主等)。
總結
以上是生活随笔為你收集整理的分布式内存数据库--Redis事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式内存数据库---Redis的持久化
- 下一篇: sql 赋值 null_巩固SQL -