2010-04-09 199 views
11

CouchDB在进行双向复制时如何处理冲突?Couchdb冲突解决方案

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

  1. 服务器A和B被复制并都有杰克文档的版本相同。
  2. 在服务器A中,Jack的手机号码已更新。
  3. 在服务器B中,更新了Jack的地址。
  4. 现在,当我们进行双向复制时存在冲突。

couchDB如何处理它?如果我们在Java程序中启动复制,有没有办法知道java程序是否有任何冲突?

回答

17

CouchDB的wiki有一个详细的explanantion:http://wiki.apache.org/couchdb/Replication_and_conflicts

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

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