本人使用的数据源切换框架是:

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

使用数据源切换,在没有开事务的时候是没有问题的。但是,在事务内切换数据会失效,当然他是不支持分布式事务,可如果在事务内我们切换下数据库只是想做一个查询的话,也是会失效。

经过查阅spring源码了解到,事务内切换数据源失效和这个数据源切换框架无关,失效的原因是因为spring检测到如果开启了事务,会将Connection缓存起来,然后在事务再执行第二条sql时候,继续使用之前缓存好的Connection,这才是导致了数据源切换失败的真正原因!!!

所以如果你在事务内切换数据源,您必须要保证切换的数据源不在事务内!!!

先说句题外话,如果多数据源切换很频繁,那么你的项目已经应该上升到了微服务的时代,以下仅做为过渡期的解决方案。

最好的办法是避免在事件内切换数据库查询,应该是在事务外查询好了,然后把值传进来。

但如何实在是需要在事务内查询,那么如何做到这个方法不能事务内呢??

解决方法一:

可以把这个查询方法排除掉在这个事务内,我们可以利用spring事务隔离机制排除他,使用方法,在对应方法上加上:

//当前方法不会运行在事务内,如果在事务内,则将事务挂起
@Transactional(propagation = Propagation.NOT_SUPPORTED)

解决方法二:

异步执行对应的方法。

注意:不支持分布式事务,不支持分布式事务,不支持分布式事务!!!以上方式,如果开启了事务,事务只会对同一个Connection生效!