【发布时间】:2014-10-24 01:46:01
【问题描述】:
我在使用 Node/Mongoose/Socket.io 时遇到了一个很大的逻辑问题......假设我有一个服务器模型,它经常在我的应用程序中同时被调用,一些调用涉及更新模型中的数据。
db.Server.findOne({_id: reference.server}).exec(function(error, server) {
catches.error(error);
if (server !== null) {
server.anything = "ahah";
server.save(function(error) { });
}
}
有时,两个人会同时调用它,而第一个人会 save() 另一个人可能已经有 findOne 的“服务器”并得到了不是最新的“旧对象”并保存()它。
这里的大问题是,当第二个人保存()“服务器”(“旧对象”)时,它实际上会覆盖第一个的更改......你可以想象它会产生的大冲突我的申请。
我曾考虑将所有 save() 方法更改为 update() 以解决问题,但在项目中的某些时候,直接使用 update() 非常棘手,而且不实用。
有没有办法在有人更新 findOne() 调用时“锁定”它?就像当你 findOne() 时你也会说“嘿,我很快就会更新,所以不要让人们现在找到它”(使用 Mongoose,甚至是 MongoDb)
我找了好久没找到答案:(
希望你能理解我的问题;)谢谢!
【问题讨论】:
-
那么如何使用 mongo 建立一个有人员的网站? ...
-
您可以构建架构,以便您可以使用原子
update调用来完成所有文档修改。 -
Tricky ...如果他们无法管理这种情况,我仍然不明白 Mongoose 的目的是什么,如果有两个人,save() 系统就没用了做类似的动作肯定会在每个网站上发生......感谢您的回复,我会重构一切;)
-
请记住,Mongoose 确实使用原子
update调用实现了save,只有$sets 文档中您实际更改的字段,所以它不像您那么糟糕重新可能在想。数组操作会给您带来最大的麻烦(这就是 Mongoose 添加versioning 的原因),但无论如何您都需要意识到发生了什么。
标签: javascript node.js mongodb mongoose socket.io