alibaba / otter

阿里巴巴分布式数据库同步系统(解决中美异地机房)
Apache License 2.0
8.06k stars 2.49k forks source link

4.2.18,I/U/D归并逻辑中,DbLoadMerger类中的replaceColumnValue方法存在问题 #1108

Open cyLeeEternalGarden opened 1 year ago

cyLeeEternalGarden commented 1 year ago
        newColumns.sort(new EventColumnIndexComparable()); // 排序
        // 把上一次变更的旧主键传递到这次变更的旧主键.
        newEventData.setOldKeys(oldEventData.getOldKeys());

这里没有对oldEventData.getOldKeys()判空,会导致: 如果上一条是udpate非主键,下一条是update主键,那么上一条的oldkeys就是为空, 那么会覆盖掉下一条的oldkeys,让下一条的oldkeys为空。

应该改为:

        if (!CollectionUtils.isEmpty(oldEventData.getOldKeys())) {
            newEventData.setOldKeys(oldEventData.getOldKeys());
        }

实际测试mysql同步无问题,因为Load阶段前把update主键转换成了insert,走不到上面的逻辑。