redis事務以及實現樂觀鎖

2021-10-13 02:59:58 字數 1478 閱讀 2577

一組命令的集合,單條命令是可以保證原子性的,但是事務不保證原子性。

乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性、順序性、排他性的執行一些命令。

-----佇列 set 、get 、set  執行--
redis事務沒有隔離級別概念。所有命令在事務中,並沒有直接被執行,只有發起執行命令(exec)的時候才會執行

1,開啟事務(multi)

2,命令入隊(…)

3,執行事務(exec)/放棄事務(discard)

執行事務:佇列中的任務開始執行

放棄事務:佇列中的命令都不會執行 命令 discard

1,編譯型異常(**有問題,命令有錯),事務中所有命令都不會執行

2,執行時異常,如果事務佇列中存在語法錯誤,那麼執行命令的時候,其他命令時可以正常執行的,錯誤命令丟擲異常。如圖,執行完成後佇列中有的命令已經執行,有的執行時異常的命令未執行,驗證了單條命令是可以保證原子性的,但是事務不保證原子性。

悲觀鎖和樂觀鎖

悲觀鎖:很悲觀,認為什麼時候都會出問題,無論做什麼都會加鎖

樂觀鎖:很樂觀,認為什麼時候都不會出問題,所以不會上鎖。更新資料的時候去判斷下,在此期間是否有人修改過這個資料,做法是**欄位version,更新前獲取version,更新的時候比較version。

使用watch命令監視(加鎖)取消監視unwatch(解鎖)

正常情況下

異常情況下

開啟watch後,開啟事務,事務未提交之前,另外乙個執行緒去修改值,然後再去提交事務發現事務提交失敗

修改money的值

再去提交事務,發現事務提交失敗

異常之後(事務失敗後)使用unwatch取消監視(解鎖),再使用watch執行一邊就可以修改資料

Redis 事務(悲觀鎖 樂觀鎖)

1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...

Redis 樂觀鎖控制事務

redis對事務的支援比較簡單。redis只能保證乙個客戶端發起的事務命令可以執行,中間不會插入其他事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當前連線進入事務上下文,把命令放...

Redis樂觀鎖控制事務

redis對事務的支援比較簡單。redis只能保證乙個客戶端發起的事務命令可以執行,中間不會插入其他事務。但 redis集群不支援事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當...