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
根据你提供的代码来看,确实是先执行delete操作再执行insert/update操作的。这是因为在这段代码中,先遍历了所有表的delete数据,然后再遍历所有表的insert/update数据,而在每个表的delete数据中,又根据是否支持batch来决定是分批次提交还是单条数据并行提交。因此,如果先插入数据再删除数据,就会出现数据不一致的问题。
如果你需要先执行insert/update操作再执行delete操作,可以在代码中进行修改。首先将遍历所有表的delete数据的代码块移到遍历所有表的insert/update数据的代码块之后,这样就可以先执行insert/update操作了。然后,根据是否支持batch来决定是分批次提交还是单条数据并行提交。这样就可以解决数据不一致的问题了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。