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

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

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

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

經(jīng)過查閱spring源碼了解到,事務內切換數(shù)據(jù)源失效和這個數(shù)據(jù)源切換框架無關,失效的原因是因為spring檢測到如果開啟了事務,會將Connection緩存起來,然后在事務再執(zhí)行第二條sql時候,繼續(xù)使用之前緩存好的Connection,這才是導致了數(shù)據(jù)源切換失敗的真正原因?。。?/p>

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

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

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

但如何實在是需要在事務內查詢,那么如何做到這個方法不能事務內呢??

解決方法一:
可以把這個查詢方法排除掉在這個事務內,我們可以利用spring事務隔離機制排除他,使用方法,在對應方法上加上:

//當前方法不會運行在事務內,如果在事務內,則將事務掛起
@Transactional(propagation = Propagation.NOT_SUPPORTED)

解決方法二:
異步執(zhí)行對應的方法。

注意:不支持分布式事務,不支持分布式事務,不支持分布式事務?。。∫陨戏绞?,如果開啟了事務,事務只會對同一個Connection生效!

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

友情鏈接更多精彩內容