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