Question

J'ai une application Django relativement simple, avec une utilisation assez lourd qui est responsable de certain dans les opérations concurrency db.

J'ai un modèle post avec un m2m à un modèle Tag.

Une seule ligne dans mon code, p.add(t) est à l'origine à plusieurs reprises des exceptions de MySQL (où p est une instance de post et t est une instance de Tag.)

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")

Lorsque cela est élevé, je peux exécuter manuellement ce p.add(t) avec succès, il doit donc avoir à faire avec un certain état particulier que le db / app sont en au moment de l'exécution normale. Il arrive environ une fois tous les 1000 tentatives d'étiquette ajoutée, sans aucun motif que je peux détecter (i.e. les deux chiffres dans la paire « 329051-1827414 » du changement par exemple)

A CHECK TABLE dans une base MySQL sur le montre le tableau pertinents qu'ils sont tous en apparence OK.

Toutes les idées?

Était-ce utile?

La solution

En général, vous voyez des erreurs comme ça lorsque vous essayez d'ajouter à une table intermédiaire si la ligne en double étant ajouté la contrainte-ensemble unique pour la FK de. Je devine que dans l'exemple que vous avez fourni « 329051 » est un identifiant Post et « 1827414 » est un identifiant Tag.

Normalement, dans Django, vous pouvez appeler le module complémentaire () méthode à plusieurs reprises pour ajouter la même instance et Django prend soin de tout pour vous. Je suppose que le gestionnaire de modèle tient à jour un état pour l'aider à déterminer si chaque add () représente une ligne nouvelle ou existante et si la ligne semble être nouvelle, il tente un insert.

Cela en soi n'explique pas pourquoi vous obtenez l'erreur. Vous mentionnez « est responsable de pas mal dans les opérations concurrency db. ». Sans savoir ce que cela signifie, je suppose que vous pourriez obtenir une condition de course où multifilet / processus tentent d'ajouter la même nouvelle balise dans le même temps et les deux essayez inserts.

Autres conseils

Je pense que je vois un problème similaire dans mon application - Si je vous envoie deux demandes identiques pour ajouter une relation m2m (par exemple étiquette dans mon cas aussi bien), je reçois cette erreur car la table m2m a une contrainte unique sur (utilisateur, étiquette). Je devine que le serveur traite les fonctions • Ajoutez en même temps .

if not already in database:
   # Both invocations reach here because the next line takes some time to process.
   create m2m row

Je ne sais pas comment cela peut être corrigée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top