Spring多数据源场景下@Transactional与@Qualifier注解失效问题求助
问题根因
你代码中存在事务管理器名称不匹配的核心错误:
- 你在
userDatabase配置类中定义的用户数据源专属事务管理器的Bean名称为tm2 - 但你在
UserService的createUser方法上标注的@Transactional指定的事务管理器名称为不存在的tm1
Spring找不到名为tm1的事务管理器Bean时,会自动使用标注了@Primary的全局默认事务管理器,最终就出现了始终走主数据源的问题。
修复方案
按顺序执行以下调整即可解决:
- 修正事务管理器名称
将UserService中@Transactional("tm1")改为@Transactional("tm2")即可。
由于你在@EnableJpaRepositories注解中已经为com.example.miniredditbackend.user包下的所有Repository指定了默认事务管理器为tm2,如果该包下的业务都走用户数据源,也可以直接省略@Transactional注解的value值,直接写@Transactional即可。 - 确认包扫描无重叠
检查你的主数据源对应的JPA配置类的basePackages扫描范围,不要和当前用户数据源的扫描包com.example.miniredditbackend.user重叠,避免多个配置类扫描同一个Repository导致优先级冲突。 - 验证配置正确性
可在配置文件中将org.springframework.transaction的日志级别调整为DEBUG,启动项目调用接口后,查看日志中事务创建时绑定的事务管理器、数据源信息,确认是否符合预期。 - 可选兜底检查
如果修改后仍未生效,再次确认@Transactional注解导入的是org.springframework.transaction.annotation.Transactional,而非JTA规范的javax.transaction.Transactional。
内容的提问来源于stack exchange,提问作者Reqq
相关产品推荐
相关产品推荐

