天天看點

樂觀鎖 —— 版本号機制

版本号機制

一般是在資料表中加上一個資料版本号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 的操作結果的可能。

繼續閱讀