Springboot事務(wù)失效的原因及解決辦法詳解
問(wèn)題
先看下問(wèn)題代碼,下面兩個(gè)方法屬于同一個(gè)service類
@Transactional(rollbackFor = Exception.class) public void addFile(FileDTO file, String operator) { //一些列操作 ... }
public void addMultiFiles(MultipartFile[] files, String operator) throws IOException { ... addFIle(); ... }
如圖,addFile添加了事務(wù)管理,然后通過(guò)測(cè)試addMultiFile測(cè)試時(shí)addFile中的事務(wù)失效,無(wú)法在出現(xiàn)異常時(shí)回滾數(shù)據(jù)庫(kù)。
原因
spring中的事務(wù)是依賴AOP的,AOP是通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)的,只有通過(guò)代理類訪問(wèn)的方法才能被攔截(外部調(diào)用都是調(diào)用的相應(yīng)的代理類)
而上述問(wèn)題中addMultiFile直接內(nèi)部調(diào)用了addFile方法,所以addFile中的事務(wù)就不會(huì)生效。
解決辦法
知道原因之后就好解決了,想辦法獲取該service類的代理類,通過(guò)代理類來(lái)調(diào)用addfile方法就行
public void addMultiFiles(MultipartFile[] files, String operator) throws IOException { ... /*進(jìn)行上傳,直接內(nèi)部調(diào)用會(huì)導(dǎo)致事務(wù)失效,需要獲取相應(yīng)的代理對(duì)象來(lái)調(diào)用*/ ((FileService)AopContext.currentProxy()).addFile(fileDTO, operator); ... }
加入后運(yùn)行會(huì)報(bào)個(gè)錯(cuò),需要你設(shè)置exposeProxy = true 在該類上加個(gè)注解
@EnableAspectJAutoProxy(exposeProxy = true) //暴露代理對(duì)象 public class FileService { ... }
此時(shí)addFile就能正?;貪L
補(bǔ)充
加入@EnableAspectJAutoProxy提示找不到該類 原來(lái)是自己沒(méi)有導(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)彩色圖片轉(zhuǎn)換為灰度圖片的示例代碼
將彩色圖片轉(zhuǎn)換為灰度圖片是圖像處理中的常見(jiàn)操作,通常用于簡(jiǎn)化圖像、增強(qiáng)對(duì)比度、或者進(jìn)行后續(xù)的圖像分析,本項(xiàng)目的目標(biāo)是通過(guò)Java實(shí)現(xiàn)將彩色圖片轉(zhuǎn)換為灰度圖片,需要的朋友可以參考下2025-02-02Java concurrency之非公平鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本篇文章主要介紹了Java concurrency之非公平鎖,詳細(xì)的介紹了獲取和釋放非公平鎖,有興趣的同學(xué)可以了解一下2017-06-06PostMan如何傳參給@RequestBody(接受前端參數(shù))
這篇文章主要介紹了PostMan如何傳參給@RequestBody(接受前端參數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解
這篇文章主要介紹了JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解,Tomcat是一個(gè)開(kāi)源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的,下面是關(guān)于Tomcat底層機(jī)制和Servlet運(yùn)行原理的簡(jiǎn)要說(shuō)明,需要的朋友可以參考下2023-10-10mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析
這篇文章主要介紹了mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01java 中Collection存儲(chǔ)器詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 中Collection存儲(chǔ)器詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04BeanUtils.copyProperties()屬性名相同但是類型不同問(wèn)題
這篇文章主要介紹了BeanUtils.copyProperties()屬性名相同但是類型不同問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09spring?參數(shù)校驗(yàn)Validation示例詳解
Spring提供了Validation工具類來(lái)實(shí)現(xiàn)對(duì)客戶端傳來(lái)的請(qǐng)求參數(shù)的有效校驗(yàn),本文給大家介紹spring?參數(shù)校驗(yàn)Validation示例詳解,感興趣的朋友一起看看吧2024-12-12