开发者社区> 问答> 正文

doTwoPhase代码问题

请教一个问题,

doTwoPhase这个方法里面results.size()和totalRows.size()不一定完全相等,因为逻辑中会过滤空记录,这样可能会造成通知加载完成的位置窜位,代码位置在com.alibaba.otter.node.etl.load.loader.db.DbLoadAction 395和407行,谢谢

原提问者GitHub用户 ehomeshasha

展开
收起
大圣东游 2023-06-21 17:18:33 31 0
2 条回答
写回答
取消 提交回答
  • 目前407行为空方法

    原回答者GitHub用户agapple

    2023-06-21 18:16:03
    赞同 展开评论 打赏
  • doTwoPhase方法是用于实现分布式事务的,包括了预提交和提交两个阶段。其中在预提交阶段,会遍历所有待提交的数据记录,检查完整性和约束条件,该阶段的目的是检查所有记录的正确性,并将锁定写入底层的存储系统中避免其它事务进行操作。

    只要在预提交阶段中检查不合法的记录,就不会将其发送到存储系统中,在提交阶段中,只有在所有的操作均通过预提交阶段,才能将全部记录提交到存储系统中。

    在你提供的代码中,results.size()totalRows.size()不一定相等的原因是,totalRows是从存储系统中取回的所有数据,而result是经过过滤掉空记录后返回的数据,因此它们的大小可能不同。

    在这种情况下,如果在返回结果的通知中直接使用了results.size(),那么确实可能会出现通知加载完成位置窜位的情况,因为它只返回了经过过滤后的记录数量,可能小于全部记录数量。

    为了避免这种情况,建议使用totalRows.size()来作为加载完成的条件,这样可以确保所有的记录都已经加载完成,并成功提交到存储系统中。

    另外,为了避免过滤可能导致的数据不一致问题,建议尽量避免过滤掉空记录或者提前将空记录进行处理,以确保所有的记录均能正确处理。

    2023-06-21 17:21:57
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

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