樂觀鎖解決丟失更新的問題
那麼我們如何實現樂觀鎖呢,一般來說有以下2種方式:
1.使用資料版本(version)記錄機制實現,這是樂觀鎖最常用的一種實現方式。何謂資料版本?即為資料增加乙個版本標識,一般是通過為資料庫表增加乙個數字型別的 「version」 欄位來實現。當讀取資料時,將version欄位的值一同讀出,資料每更新一次,對此version值加一。當我們提交更新的時候,判斷資料庫表對應記錄的當前版本資訊與第一次取出來的version值進行比對,如果資料庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期資料。用下面的一張圖來說明:
如上圖所示,如果更新操作順序執行,則資料的版本(version)依次遞增,不會產生衝突。但是如果發生有不同的業務操作對同一版本的資料進行修改,那麼,先提交的操作(圖中b)會把資料version更新為2,當a在b之後提交更新時發現資料的version已經被修改了,那麼a的更新操作會失敗。
2.樂觀鎖定的第二種實現方式和第一種差不多,同樣是在需要樂觀鎖控制的table中增加乙個字段,名稱無所謂,字段型別使用時間戳(timestamp), 和上面的version類似,也是在更新提交的時候檢查當前資料庫中資料的時間戳和自己更新前取到的時間戳進行對比,如果一致則ok,否則就是版本衝突。
注意:記得加@version註解
//樂觀鎖版本號
@tablefield
(fill = fieldfill.insert)
@version
private integer version;
package com.example.test.mpdemo.config;
import com.baomidou.mybatisplus.extension.plugins.optimisticlockerinterceptor;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.transaction.annotation.enabletransactionmanagement;
@enabletransactionmanagement
@configuration
public
class
mybatisplusconfig
}
//測試樂觀鎖
@test
public
void
testoptimisticlocker()
執行成功,可以看到資料庫中version版本的字段號已經變成了2 三 MP之樂觀鎖
事務 如果不考慮事務的隔離性,會產生讀的問題 1.髒讀 2.不可重複讀 3.虛讀 幻讀 寫問題,丟失更新問題 丟失更新 多個人同時修改一條記錄,最後提交的把之前的提交資料覆蓋 解決方案 悲觀鎖 樂觀鎖 悲觀鎖 只能乙個人操作,其他人只能等待,效率低 一般不用 樂觀鎖 在表中加欄位version,比較...
mysql樂觀鎖實現 mysql樂觀鎖實現
在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 1.丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。2.髒讀 當乙個事務讀取其它完成...
mysql 樂觀鎖實現 mysql 樂觀鎖實現
一 為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 1.丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。2....