javascript – Meteor:服务器端的Meteor.collections会发生竞争吗?

前端之家收集整理的这篇文章主要介绍了javascript – Meteor:服务器端的Meteor.collections会发生竞争吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的server / server.js中
Meteor.methods({
    saveOnServer: function() {
        var totalCount = Collections.find({
            "some": "condition"
        }).count();
        if (totalCount) {
            var customerId = Collections.update('someId',{
                "$addToSet": {
                    objects: object
                }
            },function(err) {
                if (err) {
                    throw err;
                } else {
                    return true;
                }
            });
        } else {}
    }
});

我担心当2个客户端同时调用saveOnServer()时,它将为每个客户端返回相同的totalCount,并且基本上最终将相同的整数插入到对象id中.最终目标是在服务器端使用原子操作插入行,该操作仅在成功返回totalCount并且插入文档时才完成,确保不存在重复的ID?我试图不使用mongodb _id但是有我自己的整数递增id列.

我想知道如何确保每个插入操作的字段自动递增?我目前依赖于获取文件总数.这里有竞争条件吗?如果是这样,处理这个的流星方式是什么?

解决方法

在Meteor的并发模型中,您可以将整个方法想象为不间断的事件块.为了让Meteor从中途运行一个方法切换到另一个方法,你需要“屈服” – 方法需要发出信号,“我可以被打断”.

方法在异步执行某些操作时会产生,实际上这意味着您在Meteor 0.6.5及更高版本中执行数据库更新或调用带回调的方法.由于您为更新调用提供了回调,Meteor将始终尝试在更新调用和更新的回调之间执行某些操作.但是,在Meteor 0.6.4.2及更早版本中,无论使用何种回调,数据库更新都是不可中断的.

但是,对saveOnServer的多次调用将按顺序发生,并且不会导致竞争条件.你可以调用this.unblock()来允许对saveOnServer的多次调用“同时” – 即,不共享不间断块的相同队列,标记为saveOnServer队列.

鉴于您拥有的代码,修改集合的另一种方法可以更改调用和更新之间count()的值.

您可以通过实现以下数据模型来阻止一种方法在中途使另一种方法无效:

saveOnServer : function () {
// ...
  Collections.update({_id:someId,initialized:true,collectionCount: {$gt: 0}},{$addToSet: {objects: object}});
///...
}

将对象添加到集合时:

insertObject: function() {
//...
  var count = Collections.find({some: condition}).count();
  Collections.insert({_id:someId,initialized:false,collectionCount: count});
  Collections.update({initialized:false},{$set:{initialized:true},$inc: {collectionCount: 1}});
}

请注意,虽然这可能看起来效率低下,但它反映了进行更新的确切成本,并且在不同方法中插入的行为与您的预期方式相同.在saveOnServer中,您无法插入.

相反,如果您从Collections.update中删除回调,它将同步发生,并且不会有比赛条件Meteor 0.6.5及更高版本.

猜你在找的JavaScript相关文章