gpt4 book ai didi

couchdb - 如何解决与连续复制的冲突

转载 作者:行者123 更新时间:2023-12-04 02:10:02 25 4
gpt4 key购买 nike

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

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

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

  • 如果一条记录在一个客户端上被删除,而只是在另一个客户端上更新,
    除非两个客户端都同意删除,否则更新的版本会获胜。
  • 具有最近“修改”时间戳的记录成为
    主记录,较旧的记录成为次要记录。
  • 仅存在于辅助中的任何字段(或在
    master) 被移到 master 上。
  • 保存主版本,删除次版本。

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

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

    最佳答案

    写一篇关于如何管理冲突解决的例子的文章是一个非常好的主意,它可能会令人困惑,但缺少一个

    这个想法与 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});

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

    关于couchdb - 如何解决与连续复制的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18434686/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com