spring事務(wù)內(nèi)切換數(shù)據(jù)源失效解決辦法

本人使用的數(shù)據(jù)源切換框架是:

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.5</version>
        </dependency>

使用數(shù)據(jù)源切換,在沒有開事務(wù)的時(shí)候是沒有問題的。但是,在事務(wù)內(nèi)切換數(shù)據(jù)會(huì)失效,當(dāng)然他是不支持分布式事務(wù),可如果在事務(wù)內(nèi)我們切換下數(shù)據(jù)庫只是想做一個(gè)查詢的話,也是會(huì)失效。

經(jīng)過查閱spring源碼了解到,事務(wù)內(nèi)切換數(shù)據(jù)源失效和這個(gè)數(shù)據(jù)源切換框架無關(guān),失效的原因是因?yàn)閟pring檢測(cè)到如果開啟了事務(wù),會(huì)將Connection緩存起來,然后在事務(wù)再執(zhí)行第二條sql時(shí)候,繼續(xù)使用之前緩存好的Connection,這才是導(dǎo)致了數(shù)據(jù)源切換失敗的真正原因?。?!

所以如果你在事務(wù)內(nèi)切換數(shù)據(jù)源,您必須要保證切換的數(shù)據(jù)源不在事務(wù)內(nèi)?。?!

先說句題外話,如果多數(shù)據(jù)源切換很頻繁,那么你的項(xiàng)目已經(jīng)應(yīng)該上升到了微服務(wù)的時(shí)代,以下僅做為過渡期的解決方案。

最好的辦法是避免在事件內(nèi)切換數(shù)據(jù)庫查詢,應(yīng)該是在事務(wù)外查詢好了,然后把值傳進(jìn)來。

但如何實(shí)在是需要在事務(wù)內(nèi)查詢,那么如何做到這個(gè)方法不能事務(wù)內(nèi)呢??

解決方法一:
可以把這個(gè)查詢方法排除掉在這個(gè)事務(wù)內(nèi),我們可以利用spring事務(wù)隔離機(jī)制排除他,使用方法,在對(duì)應(yīng)方法上加上:

//當(dāng)前方法不會(huì)運(yùn)行在事務(wù)內(nèi),如果在事務(wù)內(nèi),則將事務(wù)掛起
@Transactional(propagation = Propagation.NOT_SUPPORTED)

解決方法二:
異步執(zhí)行對(duì)應(yīng)的方法。

注意:不支持分布式事務(wù),不支持分布式事務(wù),不支持分布式事務(wù)!??!以上方式,如果開啟了事務(wù),事務(wù)只會(huì)對(duì)同一個(gè)Connection生效!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容