1

我有一个相对简单的 Django 应用程序,使用量很大,负责数据库操作中的一些并发性。

我有一个带有 m2m 的模型 Post 到 Tag 模型。

我的代码中的一行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”对中的两个数字都发生了变化)

一个CHECK TABLE在mysql上的相关表显示,貌似都OK。

有任何想法吗?

4

2 回答 2

1

通常,如果要添加的行与 FK 的 unique-together 约束重复,则在尝试添加到中间表时会看到类似的错误。我猜在您提供的示例中,“329051”是一个帖子 ID,“1827414”是一个标签 ID。

通常在 Django 中,您可以重复调用 add() 方法来添加相同的实例,而 Django 会为您处理所有事情。我假设模型管理器维护一些状态以帮助它确定每个 add() 是否代表一个新的或现有的行,如果该行看起来是新的,它会尝试插入。

这本身并不能解释为什么你会收到错误。您提到“负责数据库操作中的相当多的并发性。”。在不知道这意味着什么的情况下,我猜你可能会遇到一个竞争条件,其中多个线程/进程试图在同一时间添加相同的新标签,并且两者都在尝试插入。

于 2010-10-05T21:51:42.903 回答
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

我不知道如何补救。

于 2014-05-30T01:34:27.087 回答