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/