如何解决连续复制中的冲突问题

13

我对CouchDB和PouchDB都很陌生,但使用它们创建联系人管理系统,并实现跨移动设备和桌面设备同步以及离线使用。使用PouchDB比编写PHP/MySQL后端轻松得多。

我已经成功使用,当我在离线设备上进行冲突更改时,CouchDB使用算法随意选择一个获胜者,然后正确地将其推送到所有设备。

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

  1. 如果一条记录在一个客户端上被删除而只在另一个客户端上进行了更新,则更新版本获胜,除非两个客户端都同意删除。
  2. 最近“修改”时间戳最新的记录成为主记录,旧记录成为次要记录。
  3. 仅存在于次要记录中(或在主记录中为空)的任何字段都会转移到主记录中。
  4. 保存主版本,并删除次要版本。

CouchDB的指南有一个很好的解释,但我不知道如何在持续复制期间使用PouchDB API实现它。根据PouchDB API,在复制选项中有一个“onChange”侦听器,但我不明白如何使用它来拦截冲突。

如果有人能编写一个简短的教程,包括一些示例代码,我和我确定许多其他PouchDB用户都会感激!

1个回答

12

提供如何管理冲突解决的文章示例是一个很好的主意,虽然有时可能会令人困惑,但缺乏这种文章真的是一件很可惜的事情。

与CouchDB的思路完全相同,解决冲突的方式是删除未获胜的版本(如果需要,则编写新的获胜版本)。

无论如何,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});

这将需要错误处理等,代码可以写得更好,这只是对代码可能看起来像的一个快速概述


非常感谢你,Dale!这对我帮助很大。 - Colin Skow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接