是mongoDB的findAndModify“事务保存”

时间:2012-07-04 14:40:46

标签: mongodb transactions findandmodify

我知道,mongo DB上没有事务支持。但现在我需要读取文档的值,递增1并写入新值。

或者 - 不同的方式: 更新元素并同时读取值。 为此,我喜欢使用查找和修改:http://www.mongodb.org/display/DOCS/findAndModify+Command

此命令更新文档并在更新前返回值。 这是在(相同的)交易中发生的吗? 关键是:是否有可能其他会话在另一个会话的两个步骤之间更新相同的值?

(对不起,对我来说很难解释 - 我希望你明白我想说的话)

谢谢。

2 个答案:

答案 0 :(得分:4)

findAndModify命令是原子的。这意味着findmodify部分之间不会发生其他操作。这个命令完全是为了增加计数器/设置标志并同时读取它们。

答案 1 :(得分:0)

我仍然怀疑原子性。

在“Upsert and UniqueIndex¶”部分http://docs.mongodb.org/manual/reference/command/findAndModify/

编写多个客户端可以同时执行查询操作,然后执行更新操作。

  

当findAndModify命令包含upsert:true选项且查询字段未被唯一索引时,该命令可能会在某些情况下多次插入文档。

     

如果所有命令在任何命令启动修改阶段之前完成查询阶段,并且名称字段上没有唯一索引,则命​​令可以各自执行upsert,从而创建多个重复文档。

如果它是原子的那么它应该假定一个读写锁定,从而阻止其他连接执行“查询阶段”。

是否只有upsert标志的情况?因为它创建了一个新文档,所以当找到文档匹配并且在这种情况下它本质上表现为Atomic时可能会没问题。请有人澄清一下吗?