1

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

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

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

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

4

1 回答 1

1

好吧,根据这个答案Meteor $upsert 标志仍在增强列表中,并且似乎在 1.0 版本之后添加到稳定分支中。

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

这里列出了所有的实现方式。我建议您使用本机 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);
  }
});

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

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

于 2013-05-29T14:27:58.010 回答