CouchDB冲突解决方案

时间:2010-04-09 08:00:17

标签: replication couchdb conflict bidirectional

CouchDB如何在进行双向复制时处理冲突?

例如: 假设有两个地址簿数据库(在服务器A和B中)。杰克有一份文件,其中包含杰克的详细联系方式。

  1. 复制服务器A和B,两者都具有相同版本的Jack文档。
  2. 在服务器A中,杰克的手机号码已更新。
  3. 在服务器B中,杰克的地址已更新。
  4. 现在,当我们进行双向复制时,存在冲突。
  5. couchDB如何处理它?如果我们在Java程序中启动复制,是否有办法知道java程序是否存在任何冲突?

1 个答案:

答案 0 :(得分:18)

CouchDB documentation提供了解释。

简而言之:CouchDB不会尝试合并冲突的版本。两个版本都被复制到两个副本中。确定性(但从应用程序角度来看可能是任意的)算法选择其中一个作为“官方”版本。它将在两个副本上选择相同的版本。默认情况下,仅在视图中可以看到此版本。您的应用程序可以查询其他版本,并根据其需要合并它们(可能通过在屏幕上显示所有版本来涉及用户)。如果您的应用程序没有查找冲突,则会有效地丢失其中一个更新。

如果您没有使用复制或批量加载API(但是每个文档的REST API),则冲突的更新将不会进入数据库,但会因409错误而被拒绝。您必须在尝试再次更新之前进行合并(就像在Subversion中一样)。