redis對事務的支援比較簡單。redis只能保證乙個客戶端發起的事務命令可以執行,中間不會插入其他事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當前連線進入事務上下文,把命令放到佇列中,接受到exec命令後,redis會順序執行佇列中的命令。並把執行結果打包到一起返回客戶端,之後就結束了事務上下文。
一、簡單的事務控制
這個例子可以看到:兩個set命令發出後並沒有立即執行而是放到佇列中,redis接受到exec命令才開始執行。
如果有兩個執行緒同時修改了乙個變數的值,如何控制事務回滾?下面看樂觀鎖怎麼控制的?
二、樂觀鎖控制事務
1.什麼是樂觀鎖?
大多是基於資料版本的記錄機制。什麼是資料版本?就是為資料增加乙個版本標識,即為資料庫表新增乙個version欄位,當讀取資料時,把資料庫版本一同讀出,當做了修改後,將資料庫版本+1,同修改一起提交。如果提交資料的版本號 >資料庫當前版本號,提交成功。如圖:
2.樂觀鎖例項
假設資料庫中賬戶資訊表中有乙個version欄位,當前值為1,賬戶餘額為$500
這樣避免了操作員b用舊資料修改表中記錄的的可能。
3.在redis中怎麼體現的?
redis中用watch監視key,如果key在提交前被修改,則提交不成功。如下:
當session1還沒來得及對age進行修改,session2已經將age的值設為30,session1再執行的時候失敗,因為session1對age加了樂觀鎖的緣故。
watch命令會監視key,當exec時如果監視的key從呼叫watch後發生過變化,則整個事務會失敗。也可以呼叫watch多次監視多個key。
三、redis事務存在的問題
redis保證事務中的命令連續執行,但是如果其中一條命令執行失敗,事務並不回滾。
為age +1的命令成功,因為anme是string型別的,所以不能做加操作,命令有乙個失敗也不會回滾,age的值已經被修改了。
Redis樂觀鎖控制事務
redis對事務的支援比較簡單。redis只能保證乙個客戶端發起的事務命令可以執行,中間不會插入其他事務。但 redis集群不支援事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當...
Redis 事務(悲觀鎖 樂觀鎖)
1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...
Redis事務和樂觀鎖
一.事務定義 二.rdis事務 1 mutli開啟事務 multi 執行之後,客戶端可以繼續向伺服器傳送任意多條命令,這些命令不會立即被執行,而是被放到乙個佇列中,當 exec 命令被呼叫時,所有佇列中的命令才會被執行 2 exec 提交事務 如果客戶端在使用 multi 開啟了乙個事務之後,卻因為...