首頁 >資料庫 >mysql教程 >mysql樂觀鎖怎麼實現

mysql樂觀鎖怎麼實現

WBOY
WBOY原創
2022-02-24 10:59:089224瀏覽

在mysql中,可以利用資料版本Version記錄機制實現樂觀鎖,為資料表加一個version字段,每操作一次記錄的版本號加一,判斷version的值是否與剛查詢的值相等,若相等則執行更新,若不相等則不進行更新。

mysql樂觀鎖怎麼實現

本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。

mysql樂觀鎖怎麼實作

實作方法

1、用資料版本Version記錄機制實現,這是樂觀鎖最常用的實作方式。

2、資料版本,即為資料增加一個版本標識,一般是透過為資料庫表增加一個數字類型的 version欄位來實現。當讀取資料時,將version欄位的值一同讀出,資料每更新一次,對此version值加1。當我們提交更新的時候,判斷資料庫表對應記錄的當前版本資訊與第一次取出的version值進行比對,如果資料庫表目前版本號與第一次取出的version值相等,則予以更新,否則認為是過期數據。

實例

update TABLE
set value=2,version=version+1
where id=#{id} and version=#{version}

樂觀鎖定不是資料庫自帶的,需要我們自己去實作。

樂觀鎖是指操作資料庫時(更新操作),想法很樂觀,認為這次的操作不會導致衝突,在操作資料時,並不進行任何其他的特殊處理(也就是不加鎖),而在進行更新後,再去判斷是否有衝突了。整體想法就是CAS思想。

通常實作是這樣的:在表中的資料進行操作時(更新),先給資料表加一個版本(version)字段,每操作一次,將那筆記錄的版本號加1。也就是先查詢出那筆記錄,取得出version欄位,如果要對那筆記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程式對其進行操作,則可以執行更新,將version欄位的值加1;如果更新時發現此刻的version值與剛剛取得出來的version的值不相等,則表示這段期間已經有其他程序對其進行操作了,則不進行更新操作。

eg:

下單作業包含3步驟:

1、查詢出庫存資訊:

select (id,count,version) from t_goodsku where id=#{id}

2、扣減2個庫存:

程式中計算:count = count - 2;

3、更新庫存:

update t_goodsku
set count={count},version=version+1
where id=#{id} and version=#{version};

第1步中查到的version其實是快照(read-commited和read -repeatable隔離機制下的MVCC機制),在這種情況下,第3步去update時,取得鎖,where條件中進行判斷中的version=#{version},其實是拿當前version和第1步中的快照version進行比對

如果比對成功,說明在這段時間內這條資料沒有被其他執行緒更新過,update成功;

如果對比失敗,說明這段時間內這條資料被更新過,那麼update失敗,報錯回滾或自旋。

當然,這裡是為了模擬樂觀鎖的場景,實際上更新庫存時一步便可以實現:

#1、更新庫存:

update t_goodsku
set count=count -2
where id=#{id};

推薦學習:mysql影片教學

以上是mysql樂觀鎖怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn