【问题标题】:Meteor duplicate insert conflict resolution流星重复插入冲突解决
【发布时间】:2013-05-30 18:01:46
【问题描述】:

meteor 应用程序中是否有设计模式来处理多个客户端“同时”插入相同的逻辑记录?

具体来说,我有一个评分类型的应用程序,当参赛者准备好开始时,多个客户可以为参赛者创建初始的基本上空白的评分记录。然后使用记录的外观使其在页面上可供官员编辑、增加处罚计数等。

Stages =  new Meteor.Collection("contests");
Entrants = new Meteor.Collection("entrants");
Scores = new Meteor.Collection("scores");

// official picks the next entrant 
Scores.insert( stage_id:xxxx, entrant_id:yyyy)

我对乐谱记录在收藏中的编辑冲突解决的影响感到满意。我不确定如何处理多个尝试为 stage_id/entrant_id 对插入分数的客户。

在同步应用程序中,我倾向于使用某种形式的互锁或关系数据库键约束。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    嗯,根据this answer Meteor $upsert 标志仍在增强列表中,并且似乎在 1.0 版本之后添加到稳定分支中。

    所以第一种方法就是说如何添加唯一索引:

    所有的实现方式都是listed here。我建议您使用本机 mongo 索引,而不是代码实现。

    根据MongoDB中没有事务,乐观并发的方式要复杂得多。

    这是我的实现(小心,可能是错误的))):

    var result_callback = function(_id) {
      // callback to call on successfull insert made
    }
    
    var $set = {stage_id: xxxx, entrant_id: xxxx};
    var created_at = Date.now().toFixed();
    var $insert = _.extend({}, $set, {created_at: created_at});
    Scores.insert($insert, function(error, _id) {
      if (error) {
        //handle it
        return;
      }
      var entries = Scores.find($set, {sort: {created_at: -1}}).fetch()
      if (entries.length > 1) {
        var duplicates = entries.splice(0, entries.length - 1);
        var duplicate_ids = _.map(duplicates, function(entry) {
          return entry._id;
        });
        Scores.remove({_id: {$in: duplicate_ids}})
        Scores.update(entries[0]._id, $set, function(error) {
          if (error) {
            // handle it
          } else {
            result_callback(entries[0]._id)
          }
        })
      } else {
        result_callback(_id);
      }
    });
    

    希望这会给你一些好的想法)

    抱歉,我之前的回答完全不正确。

    【讨论】:

    • 这些链接的问题很有帮助。我主要考虑客户会看到什么。当用户将阶段标记为“开放”时,我现在倾向于预先创建阶段的所有分数。这不仅解决了上述问题,而且还避免了反应性流失列出不在另一个集合中的项目。
    • 我猜预创作将是最好的解决方案。简单得多。更加透明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2012-10-24
    相关资源
    最近更新 更多