javascript - Meteor:服务器端的 Meteor.collections 是否会发生争用情况?

标签 javascript mongodb meteor race-condition

在我的服务器/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 的并发模型中,您可以将整个方法想象为发生的不可中断的 block 。为了让 Meteor 从运行一种方法中途切换到启动另一种方法,您需要“让步”——该方法需要发出信号,“我可以被打断。”

方法会在它们执行异步操作时产生,这实际上意味着在 Meteor 0.6.5 及更高版本中执行数据库更新或使用回调调用方法时。由于您给 update 调用一个回调,Meteor 将 总是 尝试在调用 updateupdate 的回调。但是,在 Meteor 0.6.4.2 及更早版本中,无论使用回调,数据库更新都不会中断。

但是,对 saveOnServer 的多次调用将按顺序进行,不会导致竞争条件。您可以调用 this.unblock() 以允许对 saveOnServer 的多次调用“同时”发生——即,不共享同一个队列,标记为 saveOnServer queue,不间断的东西 block 。

根据您的代码,修改 Collections 的另一种方法可以在调用和更新之间更改 count() 的值。

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

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

将对象添加到 Collections 时:

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}});
}

请注意,虽然这可能看起来效率低下,但它反射(reflect)了在不同方法中进行更新和插入的确切成本,其行为方式符合您的预期。在 saveOnServer 中不能插入。

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

关于javascript - Meteor:服务器端的 Meteor.collections 是否会发生争用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18007014/

相关文章:

javascript - 以相同的方式将 tr 与不等数量的 td 对齐

javascript - Google Analytics Embed API 服务端图表授权定制

mongodb - Monger 缺少 java.math.Bigdecimal 的编解码器

node.js - meteor 提前 : Listing and selecting

javascript - 根据数组中的 ID 和日期获取最新版本

node.js - 设置 Heroku Scheduler 作业以向所有用户发送电子邮件 (Meteor/MongoDB)

javascript - 用于搜索和更新的 Angularjs 函数

javascript - jQuery 单击 ul 的内部并获取它的属性

node.js - 使用过滤器查询子文档数组并使用 Mongoose 返回原始文档

mongodb - Mongo 聚合使用多个 group by 计算键的出现次数