v9.8.2018.0605   由DataReader直接映射实体列表,以支持netstandard的MySql和SQLite,且提升性能
大石头 编写于 2018-06-05 00:45:23
X
这里所指的同步,就是保证主从双方数据一致性的操作。

这里将实现两个框架,主端作为数据提供者,从端作为数据消费者。
消费者从提供者获取数据,也可以向提供者提供数据修改。

因为数据提供者可能是已存在的完备系统,我们尽量不建议做数据表结构修改;
而数据消费者一般是新系统,处于较弱地位,可以修改数据表结构增加同步标记。

建议消费者增加三个字段(最后修改、最后同步、同步状态)作为同步标识,用接口来约束。
同步状态=1,添加
同步状态=2,删除
最后修改小于最后同步,不变
最后修改大于最后同步,修改

消费者和提供者的数据都有不变、添加、修改、删除四种可能,乘积就有16种
可能的数据不一致:
1,消费者不变,提供者不变,没啥说的了
2,消费者不变,提供者添加、修改,都可以更新到本地
3,消费者不变,提供者删除,这个需要检查同步时间超期的本地数据,询问提供者该数据是否存在,如果不在则删除本地数据
4,消费者添加,可以直接更新到提供者
5,消费者修改,提供者不变,更新上去
6,消费者修改,提供者修改,对比修改后两者数据,如果一致则合并,否则报告冲突
7,消费者修改,提供者删除,报告冲突
8,消费者删除,提供者不变,删除本地和提供者数据
9,消费者删除,提供者修改,报告冲突
0,消费者删除,提供者删除,删除本地

消费者同步机制:
1,取得最后同步时间,发往提供者,表示要同步这个时间点以后的数据。最后同步时间可以本地存储,也可以遍历本地表取未删除数据的最小值。
2,如果是局部数据同步,比如只同步某用户的数据,则在这一步一起附上条件
3,提供者返回该同步时间之后修改的数据主键集合(分批)
4,逐个处理,包括添加、修改本地数据,有可能出现冲突。每一个处理完之后修改相应的同步时间和更新时间
5,遍历本次未同步的本地数据,检查提供者是否还存在(分批提交),若不存在则删除本地。修改同步时间。