【问题标题】:Does MongoDB's update atomicity apply to both query and modification?MongoDB 的更新原子性是否适用于查询和修改?
【发布时间】:2012-04-06 08:25:01
【问题描述】:

MongoDB 支持原子更新。 IE。我可以确定,当文档更新时,没有其他更新会覆盖我之前的更改。我的问题与查询和更新语句的组合有关,下面的示例可以很好地说明。

db.foo.update(
{ state : 1, players: { $size: 2 } } , 
{ $push: { players : { new player document } } }, 
false , true );

在上面的例子中,如果玩家数量等于 2,我只想将一个新玩家推送到玩家集合中。鉴于上面的查询和更新语句,是否有可能两个同时更新都将一个玩家推送到同一个文件,因为在阅读文件时它的 player $size 是 2? IE。原子性是否跨越查询和更新语句的更新部分?

编辑更深入的事件序列:

考虑同时触发相同的更新两次(U1 和 U2)。以下事件序列是否可能?

  1. U1 发现文档 #1 与更新的查询部分匹配 陈述。
  2. U2 发现文档 #1 与 更新声明。
  3. U1 在文档 #1 中推送了一个新玩家。
  4. U2 在文档 #1 中推送了一个新玩家。

最终结果是文档 #1 包含的玩家比预期的多,因为 U1 和 U2 都认为文档 #1 仅包含两个玩家。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我在 mongodb-user 组上问过这个问题。 http://groups.google.com/group/mongodb-user/browse_thread/thread/e61e220dc0f6f64c

    根据Marc(在10gen工作)的回答,我描述的情况不会发生。

    您描述的情况是不可能的;没有危险 修改同一个文档的两个更新。

    【讨论】:

      【解决方案2】:

      更新:不知道我的知识了...见"The ABA Nuance"。请不要接受这个答案(或我在下面的评论),因为它可能不正确。希望得到纠正。


      您对 atomic 的解释不正确(我可以肯定,当文档更新时,没有其他更新会覆盖我之前的更改)。其他更新可以(并且将会)覆盖您的更改。但他们不会以会干扰您查询完整性的方式执行此操作。

      重要的是要知道 MongoDB 更新是atomic on single document。因此,当文档与您的查询匹配时,它会被“锁定”并准备好进行更新。请注意,您的更新 ($push) 在被锁定的同一个文档中有效。更新完成后,锁被释放。

      我不确定我是否理解“原子性是否跨越查询和更新语句的更新部分”,但是:原子意味着其他查询可以不要弄乱我们的查询。我们的查询可以更改自己“锁定”的数据。

      免责声明:我不了解 MongoDB 用于确保这种原子性的内部机制,因此从技术角度来看(尤其是与锁定相关的)可能缺乏这种描述 - 但它在概念上是有效的。从外部角度来看,这就是它的工作原理。

      【讨论】:

      • 感谢您的回复。我已经用一系列事件更新了我的问题,我希望这能澄清一些事情。我现在意识到我要问的不是原子性,而是文档级别的事务(锁定)。
      • 是的,这确实澄清了这个问题。你没有什么可担心的。在查找和更新(步骤 2 和 4)之间没有任何东西可以改变文档,否则操作将不是原子的。如果它不能以这种方式工作,那么它就是一个错误,应该这样报告。
      【解决方案3】:

      根据您写下的事件顺序,您确实可以拥有太多的玩家。更新的“查找”和“更新”的工作方式非常类似于自己对您正在迭代的每个文档进行“查找”然后“更新”。你可能想看看“$atomic”运算符:http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-ApplyingtoMultipleObjectsAtOnce

      【讨论】:

      • 请注意,OP 仅发布 2 个更新(U1 和 U2),这些步骤只是为了说明可能的冲突。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多