处理冲突

为了确保对同步社区中的项进行的变更被正确传播,目标提供程序必须检测并处理从源提供程序发送的项和目标副本中的项之间发生的冲突。Sync Framework 提供执行检测和处理冲突所需的大多数工作的变更应用方对象。

Sync Framework 支持两类在同步期间可能发生的冲突:“并发冲突”和“约束冲突”。当同一项或变更单位在稍后将进行同步的两个不同副本上发生变更时,发生并发冲突。约束冲突指违反有关项或变更单位的约束(如文件夹的关系或文件系统中同名数据的位置)的冲突。

Sync Framework 为同步应用程序提供了两个方法来指定如何处理冲突:通过设置应用于在会话期间发生的所有冲突的冲突解决策略;或者通过注册在检测到每个冲突时接收冲突通知,以便可以单独检查并解决每个冲突。

冲突处理执行流

在同步的变更应用阶段检测并处理冲突。通常,这在目标提供程序的 ProcessChangeBatch(对于托管代码)或 ProcessChangeBatch(对于非托管代码)方法中发生。

在目标提供程序使用 Sync Framework 变更应用方时,对变更批中的每一项执行以下步骤。

  1. 变更应用方确认对目标副本中项的任何更新是否导致该项处于与源变更的并发冲突中。例如,当在源副本和目标副本中均已本地变更了该项后,将检测到更新-更新冲突。

  2. 在应用程序已为并发冲突指定了某一冲突解决策略后,变更应用方会基于该策略分配一个冲突解决操作。否则,变更应用方会向应用程序通知该冲突,并且应用程序会指定冲突解决操作。

  3. 变更应用方会调度对目标提供程序的调用,以便基于冲突解决操作应用变更。例如,从目标副本中删除该项并用来自源提供程序的项替换它。

  4. 在目标应用程序将变更应用于目标副本时,目标应用程序检测约束冲突。例如,id1 标识了源变更并命名为“FavoriteBooks”,但目标副本包含 id2 标识的名称也是“FavoriteBooks”的项。目标副本将这两个项视为相同,因为它们具有相同的名称;但 Sync Framework 将这两个项视为不同,因为它们具有不同的项 ID。目标提供程序将向变更应用方报告一个约束冲突。

  5. 在应用程序指定了某一抵触冲突解决策略并且约束冲突是由于抵触而产生的冲突后,报告应用方会基于该策略分配一个冲突解决操作。否则,变更应用方会向应用程序通知该冲突,并且应用程序会指定冲突解决操作。

  6. 变更应用方会调度对目标提供程序的调用,以便基于冲突解决操作应用变更。

有关处理并发冲突的更多信息,请参见检测和解决并发冲突

有关处理约束冲突的更多信息,请参见检测和解决约束冲突

使用变更单位减少冲突

可以通过使用变更单位来表示子项变更,以减少冲突数。当使用变更单位时,将针对变更单位(而不是作为一个整体针对项)跟踪版本。因此,对同一个项内的不同变更单位进行的变更将不会导致冲突。有关更多信息,请参见同步变更单位

将冲突保存在日志中

将冲突保存在日志中可能会很有用,这样,可将冲突与同步会话分开处理,例如在用户将检查冲突并决定如何解决冲突时。此外,在通过合并冲突的两个项的数据来解决约束冲突时,在某些情况下,变更应用方可能会使用冲突日志在同步会话过程中存储临时冲突。

有关创建和使用冲突日志的更多信息,请参见记录和管理冲突

请参阅

参考

ISynchronousNotifyingChangeApplier 接口
ISynchronousNotifyingChangeApplierTarget 接口
NotifyingChangeApplier
INotifyingChangeApplierTarget

概念

实现标准自定义提供程序
应用变更