CouchDB Replication会覆盖Documents

时间:2014-02-25 08:32:38

标签: couchdb replication

我知道当您在数据库A上创建文档时,复制数据库,然后在数据库A和数据库B上对其进行更改,然后再次复制,您将遇到冲突,但修订树中存在这两个版本。

但是当您在DB A上创建具有Id XY的Doc,然后在DB B上创建具有相同Id但内容不同的Doc然后进行复制时,只存在其中一个版本。另一个被覆盖。

原因是什么,因为两个文件都没有版本,所以复制算法不能知道它们都存在?

如果是,是否有一种方法可以保存这两个版本?

Use Case是有两个数据库,一个是本地数据库,一个是在线数据库。他们是双向同步的。在两个DB上,用户创建文档。但我需要确保如果连接失败一段时间,CAN仍然可以创建文档,并且我可以在连接恢复时合并它们。我想这里的难点是CREATE而不是UPDATE吧?

1 个答案:

答案 0 :(得分:4)

首先,为了完全清晰,CouchDB 覆盖数据。您编写的数据遗忘的唯一方法是成功更新文档。

CouchDB将在复制期间引入新分支(即冲突)以保留内容的所有差异。如果你所看到的是可重复的,那么它就是一个bug。下面是我的成绩单,虽然这表明CouchDB确实按预期保留了两个版本;

  

curl 127.0.0.1:5984/db1 -XPUT   { “OK”:真}

     

卷曲127.0.0.1:5984/db2 -XPUT   { “OK”:真}

     

curl 127.0.0.1:5984/db1/mydoc -XPUT -d'{“foo”:true}'

     

{ “OK”:真, “ID”: “mydoc”, “REV”: “1-89248382088d08ccb7183515daf390b8”}

     

curl 127.0.0.1:5984/db2/mydoc -XPUT -d'{“foo”:false}'

     

{ “OK”:真, “ID”: “mydoc”, “REV”: “1-1153b140e4c8674e2e6425c94de860a0”}

     

curl 127.0.0.1:5984/_replicate -Hcontent-type:application / json -d'{“source”:“db1”,“target”:“db2”}'

     

{ “OK”:真,...}

     

卷曲'127.0.0.1:5984/db2/mydoc?conflicts=true'

     

{ “_ ID”: “mydoc”, “_ REV”: “1-89248382088d08ccb7183515daf390b8”, “foo” 的:真, “_冲突”:[ “1-1153b140e4c8674e2e6425c94de860a0”]}