我知道你不能在MongoDB中进行交易,并且认为不需要它,因为一切都锁定了整个数据库或集合,我不确定是哪一个。但是,您如何执行以下操作?
如何在mongodb中将多个插入,更新,删除或选择查询链接在一起,以便其他可能对相同数据进行操作的查询等待,直到这些查询完成?类比是ms sql server中的序列化事务隔离。
更多..
我想在集合A中插入/更新记录并更新集合B中的记录,然后阅读集合A和B但我不希望任何人(进程或线程)读取或写入集合A或B直到 BOTH A和B已被第一次查询更新或插入。
答案 0 :(得分:1)
是的,这绝对可能。
它在Mongo星球上被称为ordered bulk operations,在mongo shell中就像这样:
bulk = db.emptyCollection.initializeOrderedBulkOp()
bulk.insert({name:"First document"})
bulk.find({name:"First document"})
.update({$set:{name:"First document, updated"}})
bulk.execute()
bulk.findOne()
> {_id: <someObjectId>, name:"First document, updated"}
有关详细信息,请阅读有关Bulk Write Operations的手册。
编辑:不知何故误读了您的问题。两个集合是不可能的。但请记住,您可以在一个集合中包含不同的文档。一些ODM甚至允许将不同的模型保存到同一集合中。利用这一点,您应该能够使用上述批量操作实现您想要的功能。您可能希望将此与锁定相结合以防止写入。但是,就全局和可能的分布式锁定而言,防止读写将与事务相同。