樂觀鎖 —— 版本號機制

版本號機制

一般是在數據表中加上一個數據版本號version字段,表示數據被修改的次數,當數據被修改時,version值會加一。當線程A要更新數據值時,在讀取數據的同時也會讀取version值,在提交更新時,若剛纔讀取到的version值爲當前數據庫中的version值相等時才更新,否則重試更新操作,直到更新成功。

舉一個簡單的例子:

假設數據庫中帳戶信息表中有一個 version 字段,當前值爲 1 ;而當前帳戶餘額字段( balance )爲 $100 。

  • 操作員 A 此時將其讀出( version=1 ),並從其帳戶餘額中扣除 $50( $100-$50 )。
  • 在操作員 A 操作的過程中,操作員B 也讀入此用戶信息( version=1 ),並從其帳戶餘額中扣除 $20 ( $100-$20 )。
  • 操作員 A 完成了修改工作,將數據版本號加一( version=2 ),連同帳戶扣除後餘額( balance=$50 ),提交至數據庫更新,此時由於提交數據版本大於數據庫記錄當前版本,數據被更新,數據庫記錄 version 更新爲 2 。
  • 操作員 B 完成了操作,也將版本號加一( version=2 )試圖向數據庫提交數據( balance=$80 ),但此時比對數據庫記錄版本時發現,操作員 B 提交的數據版本號爲 2 ,數據庫記錄當前版本也爲 2 ,不滿足 “ 當前最後更新的version與操作員第一次的版本號相等 “ 的樂觀鎖策略,因此,操作員 B 的提交被駁回。
  • 這樣,就避免了操作員 B 用基於 version=1 的舊數據修改的結果覆蓋操作員A 的操作結果的可能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章