【问题标题】:MongoDB Chain queries, pseudo transactionsMongoDB链查询,伪事务
【发布时间】:2015-02-13 23:49:29
【问题描述】:

我知道您不能在 MongoDB 中进行事务,并且认为不需要它,因为所有内容都会锁定整个数据库或集合,我不确定是哪个。但是,您如何执行以下操作?

如何在 mongodb 中将多个插入、更新、删除或选择查询链接在一起,以便可能对同一数据进行操作的其他查询等到这些查询完成?一个类比是 ms sql server 中的序列化事务隔离。

更多..

我想在集合 A 中插入/更新记录并更新集合 B 中的记录,然后读取集合 A 和 B,但我不希望任何人(进程或线程)读取或写入集合 A 或 B,直到 BOTH A 和 B 已被第一个查询更新或插入。

【问题讨论】:

  • 理想情况下,如果您有原子性保证,那么您可以在 MongoDB 中构建您的数据,这样您就可以通过单个文档操作来实现原子性。在不了解您的用例的情况下,我无法帮助您做到这一点,但您可能想了解其他可以使用的技巧,例如 two-phase commits

标签: mongodb serialization transactions isolation


【解决方案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 甚至允许将不同的模型保存到同一个集合中。利用这一点,您应该能够使用上述批量操作来实现您想要的。您可能希望将此与锁定结合起来以防止写入。但就全局锁和可能的分布式锁而言,防止读写与事务相同。

【讨论】:

  • 请注意,有序的批量操作只会序列化批量操作中的操作,而不是来自其他客户端的操作。另一个客户端可以发送与批量操作交错发生的其他操作,也可以在影响多个文档的批量操作期间发送。
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多