前言
前几天在做一个项目的时候遇到的一个问题,在事务中动态切换数据源报错,于是上网百度了一下@Transaction注解的执行逻辑,然后才恍然大悟....
调用链
事务代码调用链:
service注解上@transactional-->TransactionInterceptor.interpter()-->TransactionAspectSupport.createTransactionIfNecessary()-->AbstractPlatformTransactionManager.getTransaction()-->DataSourceTransactionManager.doBegin()-->AbstractRoutingDataSource.determineTargetDataSource()[lookupKey==null去拿默认的Datasource, 不为空则使用获取到的连接]
-->DataSourceTransactionManager.setTransactional()[将连接设置到TransactionUtils的threadLocal中]
--->Repository@Annotation-->执行一般调用链, 问题在于SpringManagedTransaction.getConnection()
-->openConnection()
-->DataSourceUtils.getConnection()
-->TransactionSynchronizationManager.getResource(dataSource)不为空[从TransactionUtils的threadLocal中获取数据源], 所以不会再去调用DynamicDataSource去获取数据源
问题分析与解决
从这里可以看出来,每