multithreading - mongodb 是否使用原子查询更新?

标签 multithreading mongodb concurrency updates

mongodb 写入和更新操作是原子的,如其 docs 中所述.

但是它在使用查询时也是原子的吗?

例如:

db.collection.update( { id : 1 , count : 0 } , { $inc : { count : 1 } } )

如果我在多线程环境下执行这个操作,是否有可能某个时候id等于1的文档中的count的值会更大比 1?

最佳答案

对单个文档的任何修改都是原子的。

使用您的示例,假设有两个线程尝试使用相同的查询更新该文档:

Thread A: db.collection.update({_id: 1, count: 0}, {$inc: {count: 1}})
Thread B: db.collection.update({_id: 1, count: 0}, {$inc: {count: 1}})

包含文档的集合:

collection: {_id: 1, count: 0}

如果线程 A 设法在线程 B 之前更新文档,则集合将包含:

collection: {_id: 1, count: 1}

线程 B 将搜索与 _id:1, count:0 匹配的文档,但由于该文档已被线程 A 修改,线程 B 中的更新将不会继续(因为对于线程 B 而言,文档不再“存在”)。

也就是说,线程A会返回nMatched: 1, nModified: 1,线程B会返回nMatched: 0, n修改: 0.

为了具体回答您的问题,不会存在文档 {_id: 1, count: 2} 存在的情况。

关于multithreading - mongodb 是否使用原子查询更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51366551/

相关文章:

java - 为什么 ForkJoinPool 使用 ThreadPerTaskExecutor?

Java icmp4j 多线程 ping 不那么多线程

c# - 我应该对 "latency-critical"线程使用线程关联吗?

java - 下载数据时 UI-Thread 似乎滞后

mongodb - meteor 批量更新

java - 根据条件动态提交任务到ExecutorService

c# - 调试时似乎反复抛出异常

javascript - MongoDB:当前字段总和

javascript - Mongoose:确保数组永远不会超过一定数量的项目

c++ - Linux 中的 STL 容器和线程(并发写入)