场景描述:任务调度操作中,经常会有切换数据源进行查询、插入本地库和中间库等操作,携带事务后,可能会导致数据源切换失败,如a方法上有个事务,b方法有个事务,a调用b,此时的b方法只能执行默认a方法使用的数据源
第一种方式:方法上使用mybatisplus的事务控制@DSTransactional,在业务中动态切换数据源
@Override
@DSTransactional
public boolean add(XX xx) {
// 默认库业务正常方法调用
// 动态切换数据源
DynamicDataSourceContextHolder.push("oracle_exchange");
// 执行交换库业务
xxxmapper.add();
// 使用后清理,继续使用默认数据源
DynamicDataSourceContextHolder.clear();
}
第二种方式:在调用的方法上修改事务的传播方式,使用@Transactional(propagation = Propagation.REQUIRES_NEW)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public boolean add(){
//业务处理
}
第三种方式:主方法上不加事务,只在具体的方法上或者固定的中间库mapper上使用@DS("数据源")
方法上加
@Override
@DS("oracle_exchange")
public Do findxxx(String id) {
xxx
}
mapper接口上加,整个接口生效
@Mapper
@DS("hive")
public interface XxxMapper {
}