1. 程式人生 > >Redis樂觀鎖控制事務

Redis樂觀鎖控制事務

redis對事務的支援比較簡單。redis只能保證一個客戶端發起的事務命令可以執行,中間不會插入其他事務。但redis叢集不支援事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當前連線進入事務上下文,把命令放到佇列中,接受到exec命令後,redis會順序執行佇列中的命令。並把執行結果打包到一起返回客戶端,之後就結束了事務上下文。

一、簡單的事務控制

這個例子可以看到:兩個set命令發出後並沒有立即執行而是放到佇列中,redis接受到exec命令才開始執行。
如果有兩個執行緒同時修改了一個變數的值,如何控制事務回滾?下面看樂觀鎖怎麼控制的?

二、樂觀鎖控制事務

1.什麼是樂觀鎖?

大多是基於資料版本的記錄機制。什麼是資料版本?就是為資料增加一個版本標識,即為資料庫表新增一個version欄位,當讀取資料時,把資料庫版本一同讀出,當做了修改後,將資料庫版本+1,同修改一起提交。如果提交資料的版本號大於資料庫當前版本號,提交成功。如圖:


2.樂觀鎖例項
假設資料庫中賬戶資訊表中有一個version欄位,當前值為1,賬戶餘額為$500

這樣避免了操作員B用舊資料修改表中記錄的的可能。在SQL的where設定條件傳入值大於已有值:where $version > version

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的命令成功,因為name是string型別的,所以不能做加操作,命令有一個失敗也不會回滾,age的值已經被修改了。

轉載地址:http://blog.csdn.net/ggibenben1314/article/details/47312169