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_id
coluna da sales_flat_invoice
tabela. Quando procuro nesta tabela o increment_id
mencionado no erro ( 51986
), percebo que já existe uma fatura com isso increment_id
e é 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 51986
significa 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.
fonte
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;)Respostas:
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
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.
fonte