MongoDB的更新原子性是否适用于查询和修改?

MongoDB支持原子更新。 也就是说,我可以确定文档更新时,没有其他更新会覆盖我以前的更改。 我的问题与查询和更新语句的组合有关,最好通过下面的示例进行说明。

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

在上面的例子中,如果玩家人数等于2,我只想将新玩家推入玩家集合。鉴于上述查询和更新陈述,是否有可能两个同时更新都将玩家推到相同的文档,因为在阅读文档时,其玩家$大小是2? 也就是说,查询和更新部分更新语句的原子性是否跨越?

编辑更多深入的事件序列:

考虑同时发射两次相同的更新(U1和U2)。 下面的一系列事件是否可能?

  • U1发现文档#1匹配更新语句的查询部分。
  • U2发现文档#1匹配更新语句的查询部分。
  • U1推送文档#1中的新玩家。
  • U2在文档#1中推送新玩家。
  • 最终的结果是文档#1包含多于预期的播放器,因为U1和U2都有这样的印象:文档#1只包含两个播放器。


    我在mongodb用户组上提出了这个问题。 http://groups.google.com/group/mongodb-user/browse_thread/thread/e61e220dc0f6f64c

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

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


    随着你记下的一系列事件,你确实可以让一个玩家太多。 更新的“查找”和“更新”的工作方式非常类似于通过对每个要迭代的文档执行“查找”和“更新”来完成。 您可能想看看“$ atomic”运算符:http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-ApplyingtoMultipleObjectsAtOnce


    更新:不再确定我的知识......请参阅“ABA Nuance”。 请不要接受这个答案(或下面的评论),因为它可能不正确。 希望被纠正。


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

    知道MongoDB更新在单个文档上是原子很重要。 因此,当文档与您的查询匹配时,它就会“锁定”并准备好进行更新。 请注意,您的更新( $push )在锁定的同一文档内工作。 更新完成后,锁定被释放。

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

    免责声明:我不知道MongoDB用来确保这种原子性的内部机制,所以从技术角度来看这个描述可能是缺乏的(特别是在锁定方面) - 但它在概念上是有效的。 这是从外部的角度来看它是如何工作的。

    链接地址: http://www.djcxy.com/p/10621.html

    上一篇: Does MongoDB's update atomicity apply to both query and modification?

    下一篇: Phonegap (and jQuery Mobile)?