1

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

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

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

(对不起,对我来说这很难解释——我希望你明白我想说什么)

谢谢你。

4

2 回答 2

6

findAndModify命令是原子的。find这意味着在和modify部件之间不能发生其他操作。该命令是专门为增加计数器/设置标志并同时读取它们而制定的。

于 2012-07-04T15:15:05.857 回答
0

我仍然怀疑原子性。

在此处的“Upsert 和唯一索引¶”部分http://docs.mongodb.org/manual/reference/command/findAndModify/

写的是多个客户端可以同时进行查询操作,然后再进行更新操作。

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

如果所有命令在任何命令开始修改阶段之前完成查询阶段,并且在名称字段上没有唯一索引,则这些命令可能每个都执行更新插入,创建多个重复文档。

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

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

于 2015-05-12T08:16:56.100 回答