我知道,mongo DB上没有事务支持。但现在我需要读取文档的值,递增1并写入新值。
或者 - 不同的方式: 更新元素并同时读取值。 为此,我喜欢使用查找和修改:http://www.mongodb.org/display/DOCS/findAndModify+Command
此命令更新文档并在更新前返回值。 这是在(相同的)交易中发生的吗? 关键是:是否有可能其他会话在另一个会话的两个步骤之间更新相同的值?
(对不起,对我来说很难解释 - 我希望你明白我想说的话)
谢谢。答案 0 :(得分:4)
findAndModify
命令是原子的。这意味着find
和modify
部分之间不会发生其他操作。这个命令完全是为了增加计数器/设置标志并同时读取它们。
答案 1 :(得分:0)
我仍然怀疑原子性。
在“Upsert and UniqueIndex¶”部分http://docs.mongodb.org/manual/reference/command/findAndModify/
下编写多个客户端可以同时执行查询操作,然后执行更新操作。
当findAndModify命令包含upsert:true选项且查询字段未被唯一索引时,该命令可能会在某些情况下多次插入文档。
如果所有命令在任何命令启动修改阶段之前完成查询阶段,并且名称字段上没有唯一索引,则命令可以各自执行upsert,从而创建多个重复文档。
如果它是原子的那么它应该假定一个读写锁定,从而阻止其他连接执行“查询阶段”。
是否只有upsert标志的情况?因为它创建了一个新文档,所以当找到文档匹配并且在这种情况下它本质上表现为Atomic时可能会没问题。请有人澄清一下吗?