Meteor重复插入冲突解决方案

时间:2013-05-29 12:41:22

标签: meteor

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对的分数。

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

1 个答案:

答案 0 :(得分: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);
  }
});

希望这会给你一些好主意)

很抱歉,我的回答的上一个版本完全不正确。