继续这个问题:Why would this db.eval -> array.push execute twice for certain records?我有一个相关的问题。
有人说,评论中的$isolated
实际上可以阻止MongoDB读取由多次更新引起的移动文档。
我的主要争论点是$isolated
页面上的提醒声明:http://docs.mongodb.org/manual/reference/operator/update/isolated/#up._S_isolated
$ isolated隔离运算符不为写操作提供“全有或全无”原子性。
因此它不首先写入内存中的静态视图,$isolated
仅仅是关于停止交织操作而不是在多次更新调用中停止获取已经更新的文档(通过相同的操作),从我所看到的,它不能提供所需的原子性和隔离性。
那么$isolated
如何在这里解决相关的OP问题呢?
答案 0 :(得分:2)
$isolated
在写入完成或遇到错误之前会进行写锁定,并且在处理时不会产生锁定。这可以防止其他读写操作。它不提供全有或全无原子性,因为如果在第32756个文档上发生错误,则将保留先前的32755更新。没有回滚;更新不是原子的。更新是孤立的。
然而,这对OP没有帮助,因为它是他自己的更新,即移动文档(通过$push
)并导致它们被击中两次。对索引字段使用排序;你总是有_id
。