Violazione del vincolo di integrità: 1062 Voce duplicata per la chiave "UNQ_SALES_FLAT_INVOICE_INCREMENT_ID"


13

Sto aiutando un commerciante a rintracciare la causa principale di alcune transazioni di pagamento non riuscite (durante una giornata di ordini pesanti), non riuscite con il seguente errore

SQLSTATE [23000]: Violazione del vincolo di integrità: 1062 Voce duplicata '51986' per la chiave 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

L' UNQ_SALES_FLAT_INVOICE_INCREMENT_IDindice è una chiave univoca sulla increment_idcolonna della sales_flat_invoicetabella. Quando cerco in questa tabella la increment_idmenzionata nell'errore ( 51986), trovo che c'è già una fattura con questa increment_idin esso, ed è per un ordine effettuato da un altro cliente.

Le mie 2 domande riguardavano questo

  • Dove in Magento CE 1.9.0.1 viene normalmente creato un ID fattura?

  • Esistono problemi noti in un magazzino Magento CE 1.9.0.1 con ID fattura in collisione per ordini quasi simultanei?

Mi rendo conto che l'ID di incremento 51986significa che il negozio ha una sorta di estensione per modificare gli ID di incremento installati, ma voglio assicurarmi che non ci siano scienze conosciute prima di andare troppo in là.


1
Aggiunta di Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () come punto di debug.
Alan Storm,

1
L'ho già visto prima, ma era dovuto al fatto che qualcuno effettuava una save()chiamata di metodo in un evento osservatore specifico che a volte causava questo problema - nei giorni precedenti la revisione del codice;)
Erfan,

@AlanStorm, solo per curiosità, perché entrare nell'entità Eav, penso, Invoice è un modello piatto.
Prateek,

Credo che questo può anche accadere con predefinito Magento stackoverflow.com/questions/25918091/...
Kristof a Fooman

1
Lo so più vecchio, ma la tabella eav_entity_store è stata copiata per qualsiasi motivo. Si tratta di un errore comune, in cui l'ultimo ID ordine non corrisponde all'ordine corrente inserito. Quindi Magento usa la tabella eav_entity_store per determinare quale ID inserire nella tabella degli ordini, e in questo caso esiste già. Inoltre, si noti che questo è un problema molto comune con l'estensione del numero di ordine FooMan in quanto può ignorare questo controllo e causare questo problema di punto in bianco.
Rob,

Risposte:


3

Ordine, fattura, creditmemo, spedizione EAV fino all'1.6 (?)

La fattura @Prateek era un modello EAV e increment_id lo è ancora.

Increment_id creazione e problema

L'ID di incremento viene creato qui

\Mage_Eav_Model_Entity_Attribute_Backend_Increment which calls
\Mage_Eav_Model_Entity_Abstract::setNewIncrementId which calls
\Mage_Eav_Model_Entity_Type::fetchNewIncrementId

Suppongo che nell'ultimo metodo la transazione è iniziata (e la tabella / riga non è bloccata) può passare una creazione del secondo ordine e prendere la stessa nuova creazione increment_id.

Soluzione

Suppongo che se blocchi la riga / tabella prima di leggere, puoi evitare che qualsiasi altro processo legga la tabella fino a quando non scrivi un nuovo increment_id. Questo potrebbe essere d'aiuto: come posso bloccare una riga dopo aver usato load ()?

Ma temo che il blocco della riga causi una perdita di prestazioni negativa.


1
Ho appena visto questo post e @Fabian, questo è buono a sapersi. SE dovrebbe anche attivare le notifiche quando qualcuno è menzionato in una risposta.
Prateek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.