与Django M2M关系的IntegrityError
-
28-09-2019 - |
题
我有一个相对简单的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函数 。 通用标签
我不知道该如何补救。
不隶属于 StackOverflow