请教一个问题,
doTwoPhase这个方法里面results.size()和totalRows.size()不一定完全相等,因为逻辑中会过滤空记录,这样可能会造成通知加载完成的位置窜位,代码位置在com.alibaba.otter.node.etl.load.loader.db.DbLoadAction 395和407行,谢谢
原提问者GitHub用户 ehomeshasha
doTwoPhase
方法是用于实现分布式事务的,包括了预提交和提交两个阶段。其中在预提交阶段,会遍历所有待提交的数据记录,检查完整性和约束条件,该阶段的目的是检查所有记录的正确性,并将锁定写入底层的存储系统中避免其它事务进行操作。
只要在预提交阶段中检查不合法的记录,就不会将其发送到存储系统中,在提交阶段中,只有在所有的操作均通过预提交阶段,才能将全部记录提交到存储系统中。
在你提供的代码中,results.size()
和totalRows.size()
不一定相等的原因是,totalRows
是从存储系统中取回的所有数据,而result
是经过过滤掉空记录后返回的数据,因此它们的大小可能不同。
在这种情况下,如果在返回结果的通知中直接使用了results.size()
,那么确实可能会出现通知加载完成位置窜位的情况,因为它只返回了经过过滤后的记录数量,可能小于全部记录数量。
为了避免这种情况,建议使用totalRows.size()
来作为加载完成的条件,这样可以确保所有的记录都已经加载完成,并成功提交到存储系统中。
另外,为了避免过滤可能导致的数据不一致问题,建议尽量避免过滤掉空记录或者提前将空记录进行处理,以确保所有的记录均能正确处理。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。