Advertisement

当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)

还没有任何评论哟~