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

时间:2018-07-16 16:44:12

标签: multithreading mongodb concurrency updates

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

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

例如:

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

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

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}