mongodb update的upsert 是否线程安全 ?

10个进程在做mongodb的写操作,用的Update(key, doc, upsert=true) 可能会同时写相同的内容,现在也发现了这样的情况 …
关注者
17
被浏览
17,464

4 个回答

不安全. 见mongo 文档 docs.mongodb.com/v4.0/r

To avoid inserting the same document more than once, only use upsert:true if the query field is uniquely indexed.


The remaining operations would either:

  • update the newly inserted document, or
  • fail when they attempted to insert a duplicate.
    If the operation fails because of a duplicate index key error, applications may retry the operation which will succeed as an update operation.

木有人回答,我自己来答吧。

首先mongodb的文档有解释:

If all update() operations complete the query portion before any client successfully inserts data, and there is no unique index on the name field, then each update operation may perform an insert.

但这个解释不完全,在当前文档已经存在的情况下,多并发upsert,也可能插入多条,并且我们验证了这个可能性的存在。

嗯。。。我再添加一个问题吧。

find到的数据可能不是最新的,下一次find才是,这造成我们一些诡异的问题。