SpringBoot+MyBatisPlus中樂觀鎖的實(shí)現(xiàn)示例
樂觀鎖加注解@Version后不需要手動(dòng)進(jìn)行加1操作。樂觀鎖是一種用于解決并發(fā)沖突的機(jī)制,在數(shù)據(jù)庫中用于保護(hù)數(shù)據(jù)的一致性。@Version注解是MyBatisPlus框架中的樂觀鎖注解,它會在更新數(shù)據(jù)時(shí)自動(dòng)檢查版本號是否一致,如果一致則進(jìn)行更新操作,如果不一致則表示數(shù)據(jù)已被其他線程修改過,更新操作會失敗。
@Version注解會自動(dòng)對版本號進(jìn)行加1操作,所以在使用樂觀鎖時(shí)不需要手動(dòng)進(jìn)行加1操作。當(dāng)進(jìn)行更新操作時(shí),MyBatisPlus會自動(dòng)更新版本號,并將更新后的版本號與更新條件一起發(fā)送給數(shù)據(jù)庫,如果版本號在更新過程中發(fā)生變化,則說明數(shù)據(jù)已被其他線程修改,更新操作會失敗。
因此,使用樂觀鎖加注解@Version后,可以簡化代碼,并且可以保證數(shù)據(jù)的一致性
使用場景: 當(dāng)要更新一條數(shù)據(jù)時(shí),希望這條數(shù)據(jù)沒有被別人更新,也就是說實(shí)現(xiàn)線程安全的數(shù)據(jù)更新
1. 數(shù)據(jù)庫新增version字段, int類型, 默認(rèn)值為0
2. 引入依賴
<!--MyBatisPlus 攔截器--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency>
3. springboot啟動(dòng)類中新增bean
/** * 支持?jǐn)r截器樂觀鎖 * * @return */ @Bean public MybatisPlusInterceptor optimisticLockerInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; }
4. 實(shí)體類 version字段貼上注解 @Version
@Version private Long version;
5. sql更新語句 (@Version注解會自動(dòng)對版本號進(jìn)行加1操作,所以在使用樂觀鎖時(shí)不需要手動(dòng)進(jìn)行加1操作)
// 沒加@Version注解sql update wx_dept set name=#{name}, sn=#{sn}, version=#{version}+1 where id=#{id} and version=#{version} // 加了@Version注解sql update wx_dept set name=#{name}, sn=#{sn}, version=#{version} where id=#{id} and version=#{version}
6. service (樂觀鎖操作步驟: 每次操作前都是先查詢、替換、最后更新, 否則樂觀鎖無效)
/** * 修改部門 * * @param wxDept 部門 * @return 結(jié)果 */ @Override public AjaxResult updateWxDept(WxDept wxDept) { // 樂觀鎖操作步驟: 每次操作前都是先查詢、替換、最后更新, 否則樂觀鎖無效 // 1. 先查詢 WxDept dept = wxDeptMapper.selectWxDeptById(wxDept.getId()); log.info("查詢出來的數(shù)據(jù): {}", dept); // 2. 替換 dept.setName("小賣鋪"); dept.setSn("sell"); // 3. 最后更新 int i = wxDeptMapper.updateWxDept(dept); if (i > 0) { return AjaxResult.success("樂觀鎖更新成功"); } else { return AjaxResult.error("樂觀鎖更新失敗"); } }
7. 測試
7.1 查詢出id是1的數(shù)據(jù), 并修改數(shù)據(jù) name=小賣鋪, sn=sell
查詢出來的數(shù)據(jù): com.ruoyi.ruoyiwx.dept.domain.WxDept@861f795[ id=1 name=開發(fā)部 sn=dev version=0 ]
7.2 假設(shè)
7.1還沒更新時(shí), 就有其它線程修改了id為1的數(shù)據(jù), 版本號version=1
7.3 上面7.1執(zhí)行update更新時(shí)就會失敗, 因?yàn)榘姹咎杤ersion=1, 不是剛查詢出來的version=0
{ "msg": "樂觀鎖更新失敗", "code": 500 }
總結(jié):
1. 每次去拿數(shù)據(jù)的時(shí)候都會認(rèn)為別人不會修改數(shù)據(jù), 所以不會上鎖
2. 但是在更新的時(shí)候會判斷在此期間有沒有人去更新過這個(gè)數(shù)據(jù), 可以使用版本號version
到此這篇關(guān)于SpringBoot+MyBatisPlus中樂觀鎖的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot MyBatisPlus樂觀鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
運(yùn)行SpringBoot項(xiàng)目請求響應(yīng)流程分析以及404和500報(bào)錯(cuò)的解決辦法
這篇文章主要介紹了運(yùn)行Spring Boot項(xiàng)目請求響應(yīng)流程分析以及404和500報(bào)錯(cuò)的解決辦法,文中通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12springmvc無法訪問/WEB-INF/views下的jsp的解決方法
本篇文章主要介紹了springmvc無法訪問/WEB-INF/views下的jsp的解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口
這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口的相關(guān)資料,文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06SpringBoot教程_創(chuàng)建第一個(gè)SpringBoot項(xiàng)目
這篇文章主要介紹了SpringBoot教程_創(chuàng)建第一個(gè)SpringBoot項(xiàng)目,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06關(guān)于java中可變長參數(shù)的定義及使用方法詳解
下面小編就為大家?guī)硪黄P(guān)于java中可變長參數(shù)的定義及使用方法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12