我有一个相对简单的Django应用程序,使用相当繁重,它负责db操作中的一些并发性。
我有一个模型帖子,标签模型为m2m。
我的代码中的一行p.add(t)
重复导致mysql异常(其中p
是Post实例,t
是Tag实例。)
IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")
当引发此问题时,我可以成功手动运行此p.add(t)
,因此它必须与db / app在正常执行时所处的某些特殊状态有关。它大约每1000次添加标签一次,没有我能检测到的任何模式(即示例中“329051-1827414”对中的数字都改变了)
相关表格中的mysql中的CHECK TABLE
表明它们看起来都很好。
有什么想法吗?
答案 0 :(得分:1)
如果添加的行重复了FK的唯一一起约束,通常在尝试添加到中间表时会看到类似的错误。我猜你在提供的示例中“329051”是帖子ID,“1827414”是标签ID。
通常在Django中,您可以重复调用add()方法来添加相同的实例,Django会为您处理所有事情。我假设模型管理器维护一些状态来帮助它确定每个add()是否代表一个新的或现有的行,如果该行看起来是新的,它会尝试插入。
这本身并不能解释为什么你会收到错误。你提到“在数据库操作中负责相当多的并发性。”在不知道这意味着什么的情况下,我猜你可能会遇到竞争条件,其中多个线程/进程试图在同一时间添加相同的新标记并且两者都在尝试插入。
答案 1 :(得分:0)
我想我在我的应用程序中看到了类似的问题 - 如果我发送两个相同的请求来添加m2m关系(例如我的情况下的标签),我得到了该错误,因为m2m表具有唯一性约束(用户,标签)。我猜测服务器正在同时处理.add函数 。
if not already in database:
# Both invocations reach here because the next line takes some time to process.
create m2m row
我不知道如何解决这个问题。