如何通过连续复制解决冲突

时间:2013-08-25 23:16:21

标签: couchdb database-replication pouchdb

我是CouchDB和PouchDB的新手,并且正在使用它来创建一个可以在移动和桌面设备上同步的联系人管理系统,并且可以脱机使用。我发现使用PouchDB比编写PHP / MySQL后端要容易得多。

我一直在成功使用它,当我在离线设备上进行相互冲突的更改时,CouchDB使用算法随意挑选一个胜利者,然后将其正确地推送到所有设备。

我想要做的是实现自定义算法来合并冲突的记录。这是我想要使用的算法:

  1. 如果在一个客户端上删除记录而仅在另一个客户端上更新, 更新版本获胜,除非两个客户同意删除。
  2. 具有最新“修改”时间戳的记录成为 掌握,旧的记录成为次要的。
  3. 仅存在于辅助字段中的任何字段(或者在字段中为空 主人)被转移到主人。
  4. 保存主修订版并删除辅助修订版。
  5. CouchDB的指南有一个很好的explanation,但我不知道如何在连续复制期间使用PouchDB API实现它。根据{{​​3}},复制选项中有一个“onChange”侦听器,但我不明白如何使用它来拦截冲突。

    如果有人可以写一个简短的教程,包括一些示例代码,我和我确信很多其他PouchDB用户会很感激!

1 个答案:

答案 0 :(得分:10)

撰写一篇文章,其中包含如何管理冲突解决方案的示例,这是一个非常好的主意,它可能令人困惑,但缺少一个

这个想法与CouchDB完全相同,用于解决冲突,删除未赢取的修订(并在需要时写下新的获胜者)

#1是CouchDB冲突解决方案的工作原理,所以你不必担心,删除的叶子不会冲突

function onChange(doc) { 
  if (!doc._conflicts) return;
    collectConflicts(doc._conflicts, function(docs) {
      var master = docs.sort(byTime).unshift();
      for (var doc in docs) {
        for (var prop in doc) {
          if (!(prop in master)) { 
            master[prop] = doc[prop];
          } 
        }
      }
      db.put(master, function(err) {
        if (!err) { 
          for (var doc in docs) {
            db.remove(doc);
          }
        }
      });     
    });
  }
}

db.changes({conflicts: true, onChange: onChange});

这将需要错误处理等,可以写得更好,只是快速的餐巾纸绘制代码的样子