Redis 樂觀鎖控制事務

2021-07-04 09:03:11 字數 1428 閱讀 8405

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 開啟了乙個事務之後,卻因為...