欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot事務(wù)失效的原因及解決辦法詳解

 更新時(shí)間:2023年10月19日 09:54:59   作者:zsycode  
這篇文章主要介紹了Springboot事務(wù)失效的原因及解決辦法詳解,spring中的事務(wù)是依賴AOP的,AOP是通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)的,只有通過(guò)代理類訪問(wèn)的方法才能被攔截,而addMultiFile直接內(nèi)部調(diào)用了addFile方法,所以addFile中的事務(wù)就不會(huì)生效

問(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)文章

最新評(píng)論