Mysql 具有Django m2m关系的积分误差

Mysql 具有Django m2m关系的积分误差,mysql,django,mysql-error-1062,m2m,Mysql,Django,Mysql Error 1062,M2m,我有一个相对简单的Django应用程序,它的使用量相当大,在db操作中有相当多的并发性 我有一个带有m2m标签的模型柱 我的代码中的一行,p.add(t)反复导致mysql异常(其中p是一个Post实例,t是一个标记实例) 当出现此问题时,我可以手动成功运行此p.add(t),因此它必须与正常执行时db/app处于的某种特殊状态有关。大约每1000次标签添加尝试就会发生一次,而我无法检测到任何模式(即示例的“329051-1827414”对中的两个数字都会发生变化) mysql中相关表上的检查表

我有一个相对简单的Django应用程序,它的使用量相当大,在db操作中有相当多的并发性

我有一个带有m2m标签的模型柱

我的代码中的一行,
p.add(t)
反复导致mysql异常(其中
p
是一个Post实例,
t
是一个标记实例)

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

mysql中相关表上的
检查表显示它们看起来都正常


有什么想法吗?

如果要添加的行与FK的“唯一在一起”约束重复,通常在尝试添加到中间表时会看到类似的错误。我猜在您提供的示例中,“329051”是Post id,“1827414”是Tag id

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


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

如果要添加的行与FK的“唯一在一起”约束重复,则在尝试添加到中间表时通常会看到类似的错误。我猜在您提供的示例中,“329051”是Post id,“1827414”是Tag id

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


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

我想我在我的应用程序中看到了一个类似的问题-如果我发送两个相同的请求来添加m2m关系(例如,在我的例子中也是标记),我会得到那个错误,因为m2m表对(用户,标记)有唯一的约束。我猜服务器正在同时处理.add函数


我不知道如何解决这个问题。

我想我在我的应用程序中看到了一个类似的问题-如果我发送两个相同的请求来添加m2m关系(例如,在我的情况下也是标记),我会得到这个错误,因为m2m表对(用户,标记)有唯一的约束。我猜服务器正在同时处理.add函数

我不知道怎样才能补救

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")
if not already in database:
   # Both invocations reach here because the next line takes some time to process.
   create m2m row