Violação de restrição de integridade: 1062 Entrada duplicada para a chave 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

13

Estou ajudando um comerciante a rastrear a causa raiz de algumas transações de pagamento com falha (durante um dia intenso de pedido), que falharam com o seguinte erro

SQLSTATE [23000]: Violação de restrição de integridade: 1062 Entrada duplicada '51986' para a chave 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

O UNQ_SALES_FLAT_INVOICE_INCREMENT_IDíndice é uma chave exclusiva na increment_idcoluna da sales_flat_invoicetabela. Quando procuro nesta tabela o increment_idmencionado no erro ( 51986), percebo que já existe uma fatura com isso increment_ide é para um pedido feito por um cliente diferente.

Minhas 2 perguntas relacionadas a este

  • Onde no Magento CE 1.9.0.1 é normalmente criado um ID da fatura?

  • Existem problemas conhecidos em um Magento CE 1.9.0.1 com IDs de faturas em colisão para pedidos quase simultâneos?

Sei que o ID de incremento 51986significa que a loja tem algum tipo de extensão para alterar os IDs de incremento instalados, mas quero garantir que não haja ciência conhecida por isso antes de ir muito longe nesse caminho.

Alan Storm
fonte
1
Adicionando Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () como um ponto de depuração.
Alan Storm
1
Eu já vi isso antes, mas foi devido a alguém colocando uma save()chamada de método em um evento observador específica que, às vezes, causar esse problema - nos dias que antecederam a revisão do código;)
Erfan
@ AlanStorm, só por curiosidade, por que entrar na entidade Eav, eu acho, Fatura é um modelo simples.
Prateek
Eu acredito que isso também pode acontecer com o Magento padrão stackoverflow.com/questions/25918091/…
Kristof at Fooman
1
Sei que isso é mais antigo, mas a tabela eav_entity_store foi copiada por qualquer motivo. Esse é um erro comum, em que o último ID do pedido não corresponde ao pedido efetuado no momento. Portanto, o Magento usa a tabela eav_entity_store para determinar qual ID inserir na tabela de pedidos e, neste caso, ela já existe. Além disso, observe que esse é um problema muito comum com a extensão do número do pedido do FooMan, pois pode ignorar essa verificação e causar esse problema do nada.
Rob

Respostas:

3

Pedido, fatura, crédito, envio foi EAV até 1,6 (?)

A fatura do @Prateek ERA um modelo EAV e o incr_id ainda é.

Criação e problema Increment_id

O ID do incremento é criado aqui

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

Eu diria que, no último método, a transação foi iniciada (e a tabela / linha não está bloqueada) uma criação de segunda ordem pode passar e receber a mesma recém-criada increment_id.

Solução

Eu diria que, se você bloquear a linha / tabela antes de ler, poderá evitar que qualquer outro processo leia a tabela até escrever um novo increment_id. Isso pode ajudar: Como bloquear uma linha depois de usar load ()?

Receio, porém, que travar a linha cause uma perda de desempenho ruim.

Fabian Blechschmidt
fonte
1
Acabei de ver este post e @Fabian, é bom saber. O SE também deve acionar notificações quando alguém é mencionado em uma resposta.
Prateek