Estoy ayudando a un comerciante a rastrear la causa raíz de algunas transacciones de pago fallidas (durante un día de pedido pesado), que fallaron con el siguiente error
SQLSTATE [23000]: violación de restricción de integridad: 1062 Entrada duplicada '51986' para la clave 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'
El UNQ_SALES_FLAT_INVOICE_INCREMENT_ID
índice es una clave única en la increment_id
columna de la sales_flat_invoice
tabla. Cuando busco en esta tabla lo increment_id
mencionado en el error ( 51986
), encuentro que ya hay una factura con esto increment_id
allí, y es para un pedido realizado por un cliente diferente.
Mis 2 preguntas relacionadas con esto
¿Dónde en Magento CE 1.9.0.1 se crea normalmente un ID de factura?
¿Existen problemas conocidos en un stock Magento CE 1.9.0.1 con identificaciones de facturas colisionantes para pedidos casi simultáneos?
Me doy cuenta de que la ID de incremento 51986
significa que la tienda tiene algún tipo de extensión para cambiar las ID de incremento instaladas, pero quiero asegurarme de que no se conozca ciencia con respecto a esto antes de ir demasiado lejos en ese camino.
fuente
save()
llamada al método en un evento de observación específico que a veces causaba este problema, en los días previos a la revisión del código;)Respuestas:
El pedido, la factura, la conmemoración del crédito y el envío fueron EAV hasta 1.6 (?)
La factura de @Prateek FUE un modelo EAV y el increment_id todavía lo es.
Increment_id creación y problema
El ID de incremento se crea aquí
Supongo que porque en el último método se inicia la transacción (y la tabla / fila no está bloqueada) puede pasar una creación de segundo orden y tomar la misma recién creada
increment_id
.Solución
Supongo que si bloquea la fila / tabla antes de leer, puede evitar que cualquier otro proceso lea la tabla hasta que escriba un nuevo increment_id. Esto podría ayudar: ¿Cómo bloqueo una fila después de usar load ()?
Pero me temo que bloquear la fila hace que se pierda el mal rendimiento.
fuente