- 64
- 0
需求:
类似消息队列 多个用户同时从一个表中取数进行处理 为了保证每个用户取得数都不同 取完数后立即加上user_id
db.foo.findOneAndUpdate({"user_id":{$exists:false}, {$set:{user_id:"123456"}},{sort:{_id:1}}})
官方文档中并没有说明该命令是否线程安全 如有如下的记录
{"_id":1}
{"_id":2}
{"_id":3}
5个用户同时来请求 有没有可能都是取得_id为1的记录?
使用Python开发了一个脚本 验证了一下 似乎是线程安全的 但是又不确定 为了保险起见 应用代码还是显式加了锁 Python代码如下:
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)
0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
我是阿正啊 普通会员 1楼
findOneAndUpdate是 MongoDB 的一个用于更新单个文档的方法,但这个方法并不是线程安全的。findOneAndUpdate在 MongoDB 中用于执行复杂的查询,并更新单个文档。这个方法返回的是更新后的文档,因此如果多个线程同时尝试更新一个文档,可能会导致数据的不一致。在 MongoDB 中,线程安全通常是指多个线程之间可以安全地共享数据。在
findOneAndUpdate中,如果多个线程同时尝试更新同一个文档,可能会导致数据的不一致。如果你需要在多个线程之间共享数据,你应该使用 MongoDB 的 MongoDB driver,它提供了支持线程安全的更新操作的方法,例如
updateOne和updateMany。例如,你可以这样使用
updateOne方法来更新单个文档:javascript db.collection.updateOne( { _id: ObjectId("123") }, { $set: { field: "new_value" } } );这样,多个线程就可以同时尝试更新文档,而不会导致数据的不一致。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
