多源数据库,使用事务失效问题

发布于:2025-07-23 ⋅ 阅读:(20) ⋅ 点赞:(0)

你在 MyBatis 的 @DS("wealth50") 注解中指定了数据源 wealth50,但报错却显示在查找 strategy_privatefund.actual_fund_combination_manage 表,提示表不存在。这说明实际执行 SQL 时,查到的数据库并不是你期望的 wealth50,而是 strategy_privatefund。

可能原因

  1. 多数据源配置未生效

@DS("wealth") 依赖于你项目中多数据源的配置(如 dynamic-datasource-spring-boot-starter)。如果配置不正确,注解不会生效,还是会走默认数据源。

  1. @DS注解未被正确扫描

你的 Mapper 或 Service 层没有被 Spring 正确扫描,导致 @DS 注解失效。

  1. Mapper方法或类上注解位置不对

@DS 可以加在类或方法上,方法上的优先级高于类上。确认你加的位置是否正确。

  1. 事务传播问题

如果在 Service 层有事务注解(如 @Transactional),且事务开启时用的是默认数据源,后续即使切换数据源也会失效。

排查建议

  1. 确认依赖和配置
  • 检查 pom.xml 是否有 dynamic-datasource-spring-boot-starter 依赖。
  • 检查 application.yml 或 application.properties 是否配置了 wealth50 数据源。
  1. 确认 @DS 注解生效
  • 可以在 Mapper 类或方法上都加上 @DS("wealth50") 试试。
  • 确认包扫描路径包含了你的 Mapper。
  1. 检查事务注解
  • 如果 Service 层有 @Transactional,建议也加上 @DS("wealth50")。
  1. 打印SQL和数据源
  • 打开 MyBatis 的 SQL 日志,确认执行 SQL 时用的是哪个数据源。
  • 可以在切换数据源的地方打断点,或者打印当前数据源名。

    解决办法

    1. 在 Service 层加 @DS("wealth")

    务必把 @DS("wealth50") 加在 Service 层(和 @Transactional 同级或更高优先级),而不是只加在 Mapper 层。

    java

    Apply

    @Service

    @DS("wealth50") // 一定要加在这里

    @Transactional

    public class ActualFundCombinationManageService {

        // ... 你的代码 ...

    }

    或者加在具体方法上:

    java

    Apply

    @Service

    public class ActualFundCombinationManageService {

        @DS("wealth")

        @Transactional

        public void yourMethod() {

            // ... 你的代码 ...

        }

    }

    2. 不要只在 Mapper 上加 @DS

    只在 Mapper 上加 @DS,在有事务的情况下是无效的。


    总结

  • 有事务时,数据源切换要在事务开启前,即 @DS 要加在 Service 层或方法上。
  • 只在 Mapper 上加 @DS,事务会用默认数据源,导致查错库。

网站公告

今日签到

点亮在社区的每一天
去签到