Springboot事務(wù)失效的原因及解決辦法詳解
問題
先看下問題代碼,下面兩個方法屬于同一個service類
@Transactional(rollbackFor = Exception.class)
public void addFile(FileDTO file, String operator) {
//一些列操作
...
}
public void addMultiFiles(MultipartFile[] files, String operator) throws IOException {
...
addFIle();
...
}
如圖,addFile添加了事務(wù)管理,然后通過測試addMultiFile測試時addFile中的事務(wù)失效,無法在出現(xiàn)異常時回滾數(shù)據(jù)庫。
原因
spring中的事務(wù)是依賴AOP的,AOP是通過動態(tài)代理實現(xiàn)的,只有通過代理類訪問的方法才能被攔截(外部調(diào)用都是調(diào)用的相應(yīng)的代理類)
而上述問題中addMultiFile直接內(nèi)部調(diào)用了addFile方法,所以addFile中的事務(wù)就不會生效。
解決辦法
知道原因之后就好解決了,想辦法獲取該service類的代理類,通過代理類來調(diào)用addfile方法就行
public void addMultiFiles(MultipartFile[] files, String operator) throws IOException {
...
/*進行上傳,直接內(nèi)部調(diào)用會導(dǎo)致事務(wù)失效,需要獲取相應(yīng)的代理對象來調(diào)用*/
((FileService)AopContext.currentProxy()).addFile(fileDTO, operator);
...
}
加入后運行會報個錯,需要你設(shè)置exposeProxy = true 在該類上加個注解
@EnableAspectJAutoProxy(exposeProxy = true) //暴露代理對象
public class FileService {
...
}
此時addFile就能正常回滾
補充
加入@EnableAspectJAutoProxy提示找不到該類 原來是自己沒有導(dǎo)入aop的相關(guān)依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
到此這篇關(guān)于Springboot事務(wù)失效的原因及解決辦法詳解的文章就介紹到這了,更多相關(guān)Springboot事務(wù)失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 二進制數(shù)據(jù)與16進制字符串相互轉(zhuǎn)化方法
今天小編就為大家分享一篇java 二進制數(shù)據(jù)與16進制字符串相互轉(zhuǎn)化方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
關(guān)于jackson序列化和feign返回值的問題
這篇文章主要介紹了關(guān)于jackson序列化和feign返回值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Spring Boot 使用WebAsyncTask異步返回結(jié)果
這篇文章主要介紹了Spring Boot 使用WebAsyncTask異步返回結(jié)果的相關(guān)資料,需要的朋友可以參考下2018-02-02
微服務(wù)架構(gòu)設(shè)計RocketMQ基礎(chǔ)及環(huán)境整合
這篇文章主要介紹了微服務(wù)架構(gòu)設(shè)計入門RocketMQ的基礎(chǔ)及環(huán)境整合實現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10
IDEA2020.1啟動SpringBoot項目出現(xiàn)java程序包:xxx不存在
這篇文章主要介紹了IDEA2020.1啟動SpringBoot項目出現(xiàn)java程序包:xxx不存在,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot+ResponseBodyEmitter實時異步流式推送的實現(xiàn)
本文主要介紹了SpringBoot+ResponseBodyEmitter實時異步流式推送的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11

