了解同步知识
本主题提供有关 Sync Framework 同步算法如何使用“知识”**进行“变更枚举”**和“冲突检测”**的抽象视图。知识是一种元数据,它描述直接或通过同步已应用到副本的所有变更。变更枚举是确定源副本上哪些已发生变更的项还不为目标副本所知的过程。冲突检测是指在不将变更的知识传输到另一副本的情况下确定一个副本执行了哪些运算的过程,例如两个副本对同一项进行本地更新时。
备注
同步提供程序和应用程序一般不直接使用知识,而是调用 Sync Framework 方法,由这些方法代表自己调用知识运算。
知识运算
下表列出了同步知识运算并进行说明:
运算符 | 说明 |
---|---|
Contains |
确定指定的知识对象是否包含项的指定“版本”。(版本是副本键和滴答计数。)换句话说,是确定拥有此知识的副本是否应用了此变更。要求为此运算输入项 ID 和版本。 在变更枚举和冲突检测中使用此运算。 |
Union |
从两个知识对象构造一个新知识对象,新对象至少包含一个原始知识对象的所有变更集。 在应用变更期间使用此运算。 |
Project |
通过使用指定的知识对象和项 ID、变更单位 ID 或项 ID 的范围生成新知识对象,该对象对于指定 ID 或 ID 范围包含原始对象的所有变更,而对于其他项则不包含任何内容。 在必须将知识限制为特定的项、变更单位或项范围时使用此运算,例如,在中断的同步、批处理和某些高级形式的筛选同步期间。 |
Exclude |
通过使用指定的知识对象和项 ID 或变更单位 ID 生成新知识对象,该对象对于指定的 ID 不包含任何内容,而对于其他项则包含原始对象的所有变更。此运算与投影运算正好相反:排除运算投影除指定项之外的其他项的知识。 一般在应用变更失败期间使用此运算。 |
变更枚举
由源提供程序的开发者实现变更枚举。通过使用指定的知识运算,变更枚举按以下方式执行:
目标提供程序将目标副本的当前知识发送给源提供程序。
源提供程序检查源副本中的所有项并为每个项执行以下步骤:
确定目标知识是否包含源副本中存储的项版本。
如果不包含,将该项添加到变更批中以发送给目标提供程序。
备注
如果项存储支持变更枚举,还可以通过直接查询项存储或组合使用查询和此算法来处理变更枚举。
发送变更
必须将枚举的变更从源提供程序发送到目标提供程序。为此,将变更分为一些批,对于每批发送以下信息:
描述变更本身的元数据。对于批中包含的每个变更,提供程序将相关元数据添加到批。
生成知识**,一般是要在冲突检测中使用的源副本的当前知识。生成知识回答以下问题:在执行这些变更时知道什么?对于添加到批中的每组变更,提供程序将相关的生成知识添加到批。
已知知识**。它是投影到要在此批发送的项子集的源副本当前知识以及记录的冲突信息。已知知识回答以下问题:在应用这些变更时将获得哪些信息?Sync Framework 代表提供程序计算已知知识。
备注
可以同时执行批处理和变更枚举,因为批处理不需要等待变更枚举完成。
排序
发送变更的顺序不同,将知识投影到批中的项所需的时间将不同。例如,知识支持项 ID 范围。因此,如果按应用变更的项 ID 的顺序发送变更,知识投影的效率将很高。
无论如何排序,投影运算总是可以将知识投影到要发送的批。
错误
源提供程序无法发送枚举的项时,必须将该项从发送的已知知识中排除。使用 exclude 运算符进行排除。
冲突检测
冲突检测由 Sync Framework 组件处理,如 NotifyingChangeApplier(对于托管代码)或 ISynchronousNotifyingChangeApplier(对于非托管代码)。
在目标提供程序收到一批变更后,其中包含批的已知知识和生成知识,必须为批中的每个变更作出以下判断:
此变更是否与目标副本中存储的项的当前版本冲突?
此变更是否过时(被目标副本中存储的项的当前版本取代)?
直接回答这些问题:
当源副本的知识中未包含目标副本所存储的项的版本时,变更与当前版本有冲突。
目标副本的知识中包含变更版本时,变更过时。
备注
一般不发送过时的变更。但是,在争用情况下可能导致发送这些变更。因此,Sync Framework 必须检测并处理它们。
变更应用
在收到变更并检测冲突后,可以将变更应用于目标副本。此时,目标提供程序执行以下步骤:
为本地发生的事件调整变更批的已知知识:
如果由于中断或取消而只应用了变更的子集,为未应用的每个变更设置可恢复错误。Sync Framework 使用 project 运算符将已知知识限制为仅此集合。
如果由于数字权限管理 (DRM) 问题而导致无法应用某些变更,如对象被锁定,目标提供程序为未应用的每个变更设置可恢复错误。Sync Framework 使用 exclude 运算符将应用失败的变更从已知知识中删除。
如果检测到冲突且未加以解决,Sync Framework 同样使用 exclude 运算符将相关变更删除。
使用 Sync Framework 计算出的已更新目标知识替换目标副本的知识。