开发者社区> 问答> 正文

load阶段 先insert后delete操作执行顺序问题

1.otter版本:4.2.17版本 2.测试中 先插入数据,马上删除数据,发现load阶段执行顺序是先做delete操作,然后在做insert操作,这样的话就会导致数据不一致问题,求解释

load代码如下:

private void doLoad(final DbLoadContext context, DbLoadData loadData) {
    // 优先处理delete,可以利用batch优化
    List<List<EventData>> batchDatas = new ArrayList<List<EventData>>();
    for (TableLoadData tableData : loadData.getTables()) {
        if (useBatch) {
            // 优先执行delete语句,针对uniqe更新,一般会进行delete + insert的处理模式,避免并发更新
            batchDatas.addAll(split(tableData.getDeleteDatas()));
        } else {
            // 如果不可以执行batch,则按照单条数据进行并行提交
            // 优先执行delete语句,针对uniqe更新,一般会进行delete + insert的处理模式,避免并发更新
            for (EventData data : tableData.getDeleteDatas()) {
                batchDatas.add(Arrays.asList(data));
            }
        }
    }

    if (context.getPipeline().getParameters().isDryRun()) {
        doDryRun(context, batchDatas, true);
    } else {
        doTwoPhase(context, batchDatas, true);
    }
    batchDatas.clear();

    // 处理下insert/update
    for (TableLoadData tableData : loadData.getTables()) {
        if (useBatch) {
            // 执行insert + update语句
            batchDatas.addAll(split(tableData.getInsertDatas()));
            batchDatas.addAll(split(tableData.getUpadateDatas()));// 每条记录分为一组,并行加载
        } else {
            // 执行insert + update语句
            for (EventData data : tableData.getInsertDatas()) {
                batchDatas.add(Arrays.asList(data));
            }
            for (EventData data : tableData.getUpadateDatas()) {
                batchDatas.add(Arrays.asList(data));
            }
        }
    }

    if (context.getPipeline().getParameters().isDryRun()) {
        doDryRun(context, batchDatas, true);
    } else {
        doTwoPhase(context, batchDatas, true);
    }
    batchDatas.clear();
}

原提问者GitHub用户wuqiu-ai

展开
收起
古拉古拉 2023-06-14 21:15:29 73 0
2 条回答
写回答
取消 提交回答
  • 根据你提供的代码来看,确实是先执行delete操作再执行insert/update操作的。这是因为在这段代码中,先遍历了所有表的delete数据,然后再遍历所有表的insert/update数据,而在每个表的delete数据中,又根据是否支持batch来决定是分批次提交还是单条数据并行提交。因此,如果先插入数据再删除数据,就会出现数据不一致的问题。

    如果你需要先执行insert/update操作再执行delete操作,可以在代码中进行修改。首先将遍历所有表的delete数据的代码块移到遍历所有表的insert/update数据的代码块之后,这样就可以先执行insert/update操作了。然后,根据是否支持batch来决定是分批次提交还是单条数据并行提交。这样就可以解决数据不一致的问题了。

    2023-06-16 08:46:59
    赞同 展开评论 打赏
  • 漏掉了前置的合并sql,insert、update、delete的合并规则

    原回答者GitHub用户wuqiu-ai

    2023-06-14 22:15:33
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载