当两个用户更新同一个集合时,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);
},
});
答案 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
让我知道..