多数据源@Ds注解失效问题

69 阅读1分钟

背景

维护一个spiring boot老项目,项目代码里注册了两个数据源

  • clickhouse
  • mysql

遇到了一个问题:需要查询 clickhouse 表的方法,查询到 mysql 的表了

demo 示例

public class TestService {

    @Resource
    private TestAOperator testAOperator  // 操作 clickhouse
    
    @Resource
    private TestBOperator testBOperator  // 操作 mysql
    
    // 这个是老方法,可以操作CK 表和 myql 表
    public void save(Req  req) {
        testAOperator.f1(req);
        testBOperator.f1(req);
    }
    
    // 这是新写的方法
    @Transactional(rollbackFor = Exception.class)
    public void queryAndUpdate(Req  req) {
        testAOperator.f2(req);
        testBOperator.f2(req); // 操作 mysql 多张表,需要事务支持
    }
    
}


@Ds("click-house")
public class TestAOperator {


    public void f1(Req req) {
        ... 省略 ...
        return
    } 
    
    // 新增的方法
    public void f2(Req req) {
        ... 省略 ...
        return
    } 
}

从示例上看,很容易理解逻辑,现在执行TestAOperator.f2 的时候,查询的却是mysql的表

原因

Transactional注解优先级更高,当启用事务注解的时候,@Ds注解失效,强制查询了 mysql

解决方案

添加

   @Transactional(propagation = Propagation.NOT_SUPPORTED)
   // 新增的方法
   public void f2(Req req) {
       ... 省略 ...
       return
   } 

给 f2 方法增加不需要事务的注解,即可解决这个问题