Mongodb Mongo DB使用增量操作并发查找和修改

Mongodb Mongo DB使用增量操作并发查找和修改,mongodb,Mongodb,如果两个代理在Mongo集群上同时运行此更新查询,那么最后的updateVersion的预期值是多少 db.Task.findAndModify( { query:{"updateVersion":21}, update:{$inc:{"updateVersion":1}} } ); 如果答案是“23”,有没有办法保证读/写同步操作?MongoDB有关于并发操作的内容 在您的情况下,可能会发生这种情况,但MongoDB仍会尝试执行这两个命令: 两

如果两个代理在Mongo集群上同时运行此更新查询,那么最后的
updateVersion
的预期值是多少

db.Task.findAndModify(
    {
        query:{"updateVersion":21},
        update:{$inc:{"updateVersion":1}}
    }
);
如果答案是“23”,有没有办法保证读/写同步操作?

MongoDB有关于并发操作的内容

在您的情况下,可能会发生这种情况,但MongoDB仍会尝试执行这两个命令:

两个并发操作(至少其中一个是写操作)试图以违反存储引擎使用乐观并发控制施加的约束的方式使用资源的一种情况。MongoDB将透明地中止并重试其中一个冲突操作


所以答案是?22还是23?我已经阅读了常见问题部分。你的报价不太合适。首先,这两个操作可能根本不会导致冲突:第一个找到版本21并增加到22,第二个找到22,没有要更新的文档,每个人都很高兴-假设读/写锁定,根据这一点不清楚:。另外,在集群环境中,如果并发客户端在不同的实例上发出命令会发生什么情况?答案应该是22,因为正如您所说的,如果没有冲突,只有第一个操作更新版本。如果出现冲突,MongoDB将重试完整操作(也搜索),并且正如预期的那样,与第一个场景的操作相同。这也是我的(一厢情愿的)想法:)--但是如果两个操作都找到文档(没有读锁),然后轮流递增版本字段(写锁),最终结果是23?您是如何得出可能存在冲突的结论的?据我所知,查找操作是执行读取锁定。另一方面,
findAndModify
update
在插入前检查相应的
id
,以防止重复和不正确的更新,请参阅回复太迟,但可能对下一个来的人有帮助。