CouchDB 在进行双向复制时如何处理冲突?
例如:假设有两个地址簿数据库(在服务器 A 和 B 中)。有一份 Jack 的文档,其中包含 Jack 的联系方式。
- 服务器 A 和 B 被复制并且都具有相同版本的 Jack 文档。
- 在服务器 A 中,Jack 的手机号码被更新。
- 在服务器 B 中,Jack 的地址被更新。
- 现在,当我们进行双向复制时,就会发生冲突。
couchDB如何处理它?如果我们在 Java 程序中启动复制,有没有办法知道 Java 程序是否存在冲突?
CouchDB 在进行双向复制时如何处理冲突?
例如:假设有两个地址簿数据库(在服务器 A 和 B 中)。有一份 Jack 的文档,其中包含 Jack 的联系方式。
couchDB如何处理它?如果我们在 Java 程序中启动复制,有没有办法知道 Java 程序是否存在冲突?
CouchDB 文档提供了解释。
简而言之:CouchDB 不会尝试合并冲突的版本。两个版本都被复制到两个副本中。确定性(但从应用程序的角度来看可能是任意的)算法选择其中一个作为“官方”版本。它将在两个副本上选择相同的版本。默认情况下,只有这个版本在视图中可见。您的应用程序可以查询其他版本,并根据需要合并它们(可能通过在屏幕上显示所有版本来涉及用户)。如果您的应用程序不查找冲突,则两个更新之一将有效丢失。
如果您没有使用复制或批量加载 API(而是每个文档的 REST API),则冲突更新不会进入数据库,而是会因 409 错误而被拒绝。您必须在尝试再次更新之前合并(就像在 Subversion 中一样)。