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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.