@Transactional
方法添加了 @Transactional 注解,Spring 事务就会生效。此时,Spring TransactionInterceptor 会通过 AOP 拦截该方法,创建事务。而创建事务,势必就会获得数据源。那么 TransactionInterceptor 会使用 Spring DataSourceTransactionManager 创建事务,并将事务信息通过 ThreadLocal 绑定在当前线程。 因为@Transactional会创建事务然后获得数据源,因为我们service方法上没有@DS注解,就拿了默认数据源,并且在这之后,这个事务信息会通过threadLocal跟当前线程绑定,事务信息包括connection连接,也就意味着,在进入这个service方法的时候,当前事务就绑定了数据源,执行到下一个sql 时,因为connection已经存在,所以拿到的还是之前的数据源,这个时候就找不到另外库中的表了。
解决方法:
把不同库的操作方法分离成独立的方法,并都加上@Transactional和@DS注解(在service上加)。
注意: 一定要把@Transactional设置为Propagation.REQUIRES_NEW,这样在调用另一个事务方法时,TransactionInterceptor 会将原事务挂起,暂时性的将原事务信息和当前线程解绑。