我想更新一个涉及读取其他集合和复杂修改的文档,因此更新运算符findAndModify()
不能达到我的目的。
这是我所拥有的:
Collection.findById(id, function (err, doc) {
// read from other collection, validation
// modify fields in doc according to user input
// (with decent amount of logic)
doc.save(function (err, doc) {
if (err) {
return res.json(500, { message: err });
}
return res.json(200, doc);
});
}
我担心的是,如果多个客户端碰巧修改同一个文档,此流程可能会导致冲突。
据说here http://docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/ that:
对于 MongoDB 数据库,对单个文档的操作始终是原子的
我有点困惑什么Operations
mean.
- 这是否意味着
findById()
将获取锁直到doc
超出范围(发送响应后),所以不会有冲突? (我不这么认为)
- 如果没有,如何修改我的代码以支持多个客户端知道他们会修改 Collection?
- 如果发生冲突,Mongoose 会报告吗?
- How to handle the possible conflict? Is it possible to manually lock the Collection?
- 我看到使用 Mongoose 的建议
versionKey
(或时间戳)并重试过时文档
- 不要完全使用 MongoDB...
Thanks.
EDIT
感谢@jibsales的指点,我现在使用Mongoose的versionKey
(时间戳也可以)以避免发生冲突。
aaronheckmann — Mongoose v3 第 1 部分 :: 版本控制 http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning
请参阅此示例代码:
https://gist.github.com/anonymous/9dc837b1ef2831c97fe8 https://gist.github.com/anonymous/9dc837b1ef2831c97fe8
操作指的是读/写。请记住,MongoDB 不是符合 ACID 的数据层,如果您需要真正的 ACID 合规性,那么最好选择其他技术。也就是说,您可以通过两阶段提交技术实现原子性和隔离MongoDB 文档中的这篇文章概述了 http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/。这不是一件小事,所以要做好承担一些繁重工作的准备,因为您需要使用本地驱动程序而不是 Mongoose。再说一遍,我的最终建议是,如果您需要事务支持(听起来您确实需要),则不要喝 NoSQL koolaid。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)