總是認為不會產生併發問題,每次去取資料的時候總認為不會有其他執行緒對資料進行修改,因此不會上鎖。但是在更新時會判斷其他執行緒在這之前有沒有對資料進行修改(一般會檢查version有沒有修改),一般會使用版本號機制或cas操作實現。
1. select data as old_data, version as old_version from …;
2. 根據獲取的資料進行業務操作,得到new_data和new_version
3. update set data = new_data, version = new_version where version = old_version
if(updated row > 0)
else
@data
@noargsconstructor
@allargsconstructor
public
class
article
implements
serializable
//更新文章
public
void
updatearticle
(article article)
;
//更新文章
public
void
updatearticle
(article article)
;
"updatearticle"
parametertype
="article"
>
update articles set
view_num =(case when #=null then view_num else # end),
comment_num=(case when #=null then comment_num else # end),
category_id=(case when #=null then category_id else # end),
like_num=(case when #=null then like_num else # end),
version = version + 1
where article_id=# and version = #
update
>
主要就是加了version的判斷
因為article2插隊,article1的更新沒有成功,樂觀鎖起了作用。其實mybatis-plus中可以自動配置樂觀鎖,但這裡還是記錄一下sql原生樂觀鎖的實現方式。
mybatis 樂觀鎖和邏輯刪除
本篇介紹easymybatis如配置樂觀鎖和邏輯刪除。easymybatis提供的樂觀鎖使用方式跟jpa一樣,使用 version註解來實現。即 資料庫增加乙個int或long型別欄位version,然後實體類version欄位上加上 version註解即可。實現原理是根據mysql的行鎖機制 in...
MyBatis 實現樂觀鎖遇到的問題
mybatis 通過版本號方式實現樂觀鎖 1.先查詢出 select status,version from t table where status 1 and xx 2.修改使用狀態status為2 update t table set status 2,version version 1 wh...
樂觀鎖以及樂觀鎖的實現
樂觀鎖以及樂觀鎖的實現 一 為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 1.丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用...