当upsert设置为True时,过滤器与唯一键一致,在高并发情况下会抛出E11000错误:重复键错误.如何解决?
发布时间
阅读量:
阅读量
db.collection.createIndex({"id": 1, "platform": 1}, {unique:true})
db.collection.update_one(
{"id": id, "platform": platform)},
{'$set': {"some_key": data}}, upsert = True)
我已建立了一个复合索引,并使用搜索条件将其被指定为唯一。通过这种方式,在该集合中,一旦检索到内容,则检索到的内容将始终保持唯一。
当系统处于高负载状态时,在同一时间会有多个服务同时对同一个collection执行update_one操作,并且设置upsert=true。所有这些操作均采用update_one + upsert=true的方式进行。每隔一段时间系统就会遇到E11000 duplicate key error collection的错误提示。
这是为什么呢?
在源码中 upsert的解释是
upsert (可选): 如果设置为True,则执行插入操作以填充符合条件的文档。
无法找到对应的数据时就添加一条新记录;如果找到对应的数据,则进行数据更新;这样操作后可能会遇到哪些潜在的问题?为何会出现唯一的键冲突情况?
当设置为true时,在执行更新操作期间,可能存在多个(
全部评论 (0)
还没有任何评论哟~
