Ich helfe einem Händler dabei, die Ursache für einige fehlgeschlagene Zahlungstransaktionen (während eines Tages mit hohen Bestellmengen) zu ermitteln, die mit dem folgenden Fehler fehlgeschlagen sind
SQLSTATE [23000]: Verletzung der Integritätsbedingung: 1062 Doppelter Eintrag '51986' für Schlüssel 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'
Der UNQ_SALES_FLAT_INVOICE_INCREMENT_ID
Index ist ein eindeutiger Schlüssel für die increment_id
Spalte in der sales_flat_invoice
Tabelle. Wenn ich in dieser Tabelle nach dem increment_id
in error ( 51986
) genannten Produkt suche , finde ich, dass bereits eine Rechnung mit diesem Produkt increment_id
vorhanden ist und dass es sich um eine Bestellung eines anderen Kunden handelt.
Meine 2 Fragen bezogen sich darauf
Wo wird in Magento CE 1.9.0.1 normalerweise eine Rechnungs-ID erstellt?
Gibt es bekannte Probleme in einem Lager Magento CE 1.9.0.1 mit kollidierenden Rechnungs-IDs für nahezu gleichzeitige Bestellungen?
Ich weiß, dass die Inkrement-ID 51986
bedeutet, dass der Store eine Erweiterung zum Ändern der installierten Inkrement-IDs hat, aber ich möchte sicherstellen, dass keine wissenschaftlichen Erkenntnisse vorliegen, bevor ich diesen Pfad zu weit gehe.
quelle
save()
Methodenaufruf in ein bestimmtes Beobachterereignis platzierte, was manchmal zu diesem Problem führte - in den Tagen vor der Codeüberprüfung;)Antworten:
Bestellung, Rechnung, Gutschrift, Versand war EAV bis 1.6 (?)
@ Rateek Rechnung war ein EAV-Modell und die increment_id ist immer noch.
Increment_id Erstellung und Problem
Hier wird eine Inkrement-ID erstellt
Ich würde annehmen, da in der letzten Methode die Transaktion gestartet wird (und die Tabelle / Zeile nicht gesperrt ist), kann eine Erstellung einer zweiten Bestellung vorbeigehen und dieselbe neu erstellte übernehmen
increment_id
.Lösung
Ich gehe davon aus, dass Sie, wenn Sie die Zeile / Tabelle vor dem Lesen sperren, vermeiden können, dass ein anderer Prozess die Tabelle liest, bis Sie eine neue increment_id schreiben. Dies könnte helfen: Wie sperre ich eine Zeile nach der Verwendung von load ()?
Ich befürchte jedoch, dass das Sperren der Zeile zu einem schlechten Leistungsverlust führt.
quelle