Frage

Ich habe eine relativ einfache Django app, mit ziemlich starkem Einsatz, die schon seit geraumer Parallelität in den db-Operationen verantwortlich ist.

Ich habe ein Modell Post mit einem m2m zu einem Tag-Modell.

Eine einzelne Zeile in meinem Code, p.add(t) wiederholt mysql Ausnahmen verursacht (wo p ist eine Post-Instanz und t ist ein Tag ein.)

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

Wenn diese angehoben ich manuell diese p.add(t) erfolgreich ausgeführt werden kann, so muss es mit etwas eigenartigen Zustand zu tun hat, dass die db / app in zum Zeitpunkt der normalen Ausführung ist. Es geschieht etwa alle 1000-Tag-Zugabe versucht, ohne Muster, dass ich (das heißt beide Zahlen in der „329.051 bis 1.827.414“ Paar des Beispiels ändern) erfassen kann,

Ein CHECK TABLE in mysql auf der entsprechenden Tabelle zeigt, dass sie alle scheinbar OK.

Irgendwelche Ideen?

War es hilfreich?

Lösung

In der Regel sehen Sie Fehler so, wenn auf eine Zwischentabelle hinzuzufügen versuchen, wenn die Zeile dupliziert die einzigartige Zusammen Einschränkung für die der FK hinzugefügt werden. Ich vermute, dass in dem Beispiel, das Sie zur Verfügung gestellt „329051“ ist eine Post-ID und „1827414“ ist eine Tag-ID.

Normalerweise in Django können Sie das Add () -Methode aufrufen, immer wieder die gleiche Instanz hinzufügen und Django kümmert sich um alles für Sie. Ich gehe davon aus, die Modell-Manager einige Zustände hält es zu helfen, festzustellen, ob jeder add (), um eine neue oder bestehende Reihe stellt und wenn die Zeile neu zu sein scheint, versucht es, einen Einsatz.

Das ist an sich nicht erklären, warum Sie die Fehler sind immer. Sie erwähnen „ist verantwortlich für einige Parallelität in den db-Operationen.“. Ohne zu wissen, was das bedeutet, ich nehme an, dass Sie eine Race-Bedingung bekommen, wo mehrere Thread werden könnten / versuchen, Prozesse den gleichen neuen Tag um die gleiche Zeit hinzuzufügen und beide versuchen Einsätze.

Andere Tipps

Ich glaube, ich bin ein ähnliches Problem in meiner Anwendung zu sehen - Wenn ich zwei identische Anfragen senden (wie auch zB Tag in meinem Fall) eine m2m Beziehung hinzuzufügen, ich diesen Fehler erhalten, weil die m2m Tabelle eine eindeutige Einschränkung hat auf (user, tag). Ich schätze, dass die Server die Verarbeitung der .add Funktionen zur gleichen Zeit .

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

Ich weiß nicht, wie das behoben werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top