流星的竞争条件

时间:2017-01-25 06:24:33

标签: javascript meteor

当两个用户更新同一个集合时,Meteor如何防止竞争状况?我怀疑它必须对纤维做些什么。

以下代码来自todo列表教程。如果两个用户同时切换复选框,该怎么办?流星如何防止竞争状况。你能指出我在源代码中的正确位置吗?

Template.task.events({                                                                                               
  'click .toggle-checked'() {
    // Set the checked property to the opposite of its current value
    Tasks.update(this._id, {
      $set: { checked: ! this.checked },
    });
  },
  'click .delete'() {
    Tasks.remove(this._id);
  },
});

2 个答案:

答案 0 :(得分:1)

Meteor在你的场景中没有做任何事情,由MongoDB来处理它。这取决于您正在使用的存储引擎。

WiredTiger允许记录级锁定。点击此处:https://docs.mongodb.com/manual/faq/concurrency/#how-granular-are-locks-in-mongodb

  

对于大多数读写操作,WiredTiger使用乐观   并发控制。 WiredTiger仅在全局使用意图锁,   数据库和集合级别。当存储引擎检测到时   两个操作之间的冲突,一个会产生写冲突   导致MongoDB透明地重试该操作。

答案 1 :(得分:0)

我认为这是一个边缘案例。 Meteor绑定到Mongodb,Mongodb在更新时实现锁定。在SO中也有人应该证实这一点。另外,根据我的经验,我没有遇到这个问题。

无论如何,如果您还想对某个方法的调用进行速率限制(限制对服务器中方法的调用),您可以使用大气中的https://atmospherejs.com/meteor/ddp-rate-limiter包!使用此功能时,您将能够限制对当前用户的方法的调用。流星厨师博客提供了一个很好的指南:https://themeteorchef.com/tutorials/rate-limiting-methods

让我知道..