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