背景
维护一个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 方法增加不需要事务的注解,即可解决这个问题