mongodb findOneAndUpdate线程安全吗?
许多用户可以同时从一个集合中获得一条记录,然后立即设置user_id
,因此其他用户无法再次获得相同的记录(就像消息队列一样,每个用户都会使用不同的数据)。见下文
db.foo.findOneAndUpdate({"user_id":{$exists:false}, {$set:{user_id:"123456"}},{sort:{_id:1}}})
我已经编写了一个python脚本来检查它是否线程安全,看来findOneAndUpdate
是线程安全的。是吗?
def query_and_set_user_id(user_id):
result = db.test.find_one_and_update({"user_id":{"$exists":False}},{'$set': {'user_id': user_id}}, sort=[("id", 1)])
print(threading.current_thread(), result)
return result
max_workers = 5
pool = ThreadPoolExecutor(max_workers)
futures = []
for i in range(max_workers):
f = pool.submit(query_and_set_user_id, "user_{}".format(i+1))
futures.append(f)
wait(futures)