假设我有一个具有两个属性“开始”和“结束”的文档。一个版本可能有一个开始时间和结束时间,反之亦然。我不想选择一个单一的修订作为获胜者,我希望最终文档包含修订的开始时间,它不为空,并且与结束相同。
在同步期间处理此类冲突解决方案是否有任何最佳实践?我发现的文档包含有关选择单个修订作为获胜者的说明,但我想从多个修订中选择值。
特定于 C#/MyCouch 库的示例会很棒,但也非常感谢任何一般性或其他语言建议。
您不能在复制(又名同步)期间指定自定义的冲突解决方式。CouchDB 会自动选择获胜的版本,您不能影响它:
默认情况下,CouchDB 使用确定性算法选择一个任意版本作为“获胜者”,以便在所有对等点上做出相同的选择。
您可以通过执行特定于应用程序的文档修订合并来等待复制完成并在之后处理冲突。
查看处理冲突文档的文档,我发现了以下伪代码示例:
- 获取 docid?conflicts=true
- 对于 _conflicts 数组中的每个成员: GET docid?rev=xxx 如果在此阶段发生任何错误,请从步骤 1 重新开始。(可能存在其他人已经解决此冲突并删除该 rev 的竞赛)
- 执行特定于应用程序的合并
- 写入 _bulk_docs 并更新第一个 rev 并删除其他 revs。