本人使用的數(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生效!