mongodb
的写和更新操作是原子的,如其docs中所述。
但是使用查询时它也是原子的吗?
例如:
db.collection.update( { id : 1 , count : 0 } , { $inc : { count : 1 } } )
如果我在多线程环境中执行此操作,是否有可能在某个时刻count
等于1的文档中id
的值大于1?
答案 0 :(得分: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, nModified: 0
。
要专门回答您的问题,在任何情况下都不会存在文档{_id: 1, count: 2}
。