MybatisPlus:樂觀鎖(已更新)


前言:

  樂觀鎖/悲觀鎖毫無疑問是面試經常被問到的,那么什么是樂觀鎖/悲觀鎖?

  樂觀鎖,就是非常樂觀,無論做什么事都不會去上鎖,僅在最后提交時采取做檢查(是否有其它線程更改了他的資源)

  悲觀鎖,悲觀的態度,無論做什么事都會上鎖(事情可以理解為事務),再去操作,這無疑很嚴謹,但也是浪費了資源

注意:並發問題的解決方式只能是變為串行

此篇主要講解結合MybatisPlus的樂觀鎖機制

mybatisPlus的樂觀鎖插件

當要更新一條記錄的時候,希望這條記錄沒有被別人更新
樂觀鎖實現方式:

  • 取出記錄時,獲取當前version
  • 更新時,帶上這個version
  • 執行更新時, set version = newVersion where version = oldVersion
  • 如果version不對,就更新失敗

使用方法

 

 

 

 

說明:

  • 支持的數據類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整數類型下 newVersion = oldVersion + 1
  • newVersion 會回寫到 entity 中
  • 僅支持 updateById(id) 與 update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能復用!!!

mybatisPlus樂觀鎖插件的工作流程

先查詢,獲得版本號 version = 1(就是當前版本),用來判定是否有其它線程搶占這個資源,如果有,就更新失敗,搶占線程更新成功!!

測試MybatisPlus樂觀鎖字段

1,數據庫加字段(用作版本控制),默認值設為1

 

 2,實體添加對應的字段映射

 

 

3,注冊樂觀鎖插件

既然是樂觀鎖插件,自然要去配置bean

 

 注意:我這里用到是3.0.4版本,如果是3.4.0版本可以去mybatisPlus官網找最新配置類相關代碼

現在,mybatisPlus的樂觀鎖插件就已經配置好了

 

測試

 

 數據庫變化:

 

 解釋:

  此時的變化正好與不加樂觀鎖的情況相反,先搶占資源的線程更新數據成功,說明version(樂觀鎖版本控制成功實現),其原理就是當多個線程同時對一個資源進行操作時,那么后台會根據version去判斷當前版本,如果當前版本沒有version+1,就證明當前線程對資源的操作已經被別的線程給搶占了,所以會操作失敗,這也就是樂觀鎖的作用,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM