前言:
樂觀鎖/悲觀鎖毫無疑問是面試經常被問到的,那么什么是樂觀鎖/悲觀鎖?
樂觀鎖,就是非常樂觀,無論做什么事都不會去上鎖,僅在最后提交時采取做檢查(是否有其它線程更改了他的資源)
悲觀鎖,悲觀的態度,無論做什么事都會上鎖(事情可以理解為事務),再去操作,這無疑很嚴謹,但也是浪費了資源
注意:並發問題的解決方式只能是變為串行
此篇主要講解結合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,就證明當前線程對資源的操作已經被別的線程給搶占了,所以會操作失敗,這也就是樂觀鎖的作用,
