我有一个相对简单的Django应用,使用量很大,它负责db操作中的一些并发。

我有一个M2m到Tag模型的模型Post。

在我的代码中,p.add(t)单行反复引起mysql异常(其中p是Post实例,t是Tag实例。) 通用标签

出现此问题时,我可以成功手动运行此p.add(t),因此它必须与db / app在正常执行时所处的某些特殊状态有关。大约每1000次添加标签的尝试就会发生一次,而没有我可以检测到的任何模式(即示例中“ 329051-1827414”对中的两个数字都发生了更改)

相关表中的mysql中的CHECK TABLE显示它们似乎都不错。

有什么想法吗?

有帮助吗?

解决方案

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

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

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

其他提示

我认为我的应用程序中也遇到了类似的问题-如果我发送两个相同的请求以添加m2m关系(例如,在我的情况下也为标签),则会收到该错误,因为m2m表对(用户,标签)。我猜服务器正在同时处理.add函数 通用标签

我不知道该如何补救。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top