Я помогаю продавцу отследить причину некоторых неудачных платежных транзакций (в течение тяжелого дня заказа), которые завершились следующей ошибкой
SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '51986' для ключа 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'
UNQ_SALES_FLAT_INVOICE_INCREMENT_ID
Индекс представляет собой уникальный ключ на increment_id
колонке в sales_flat_invoice
таблице. Когда я смотрю в этой таблице increment_id
упомянутое в error ( 51986
), я обнаруживаю, что там уже есть счет с этим increment_id
, и он относится к заказу, сделанному другим клиентом.
Мои 2 вопроса, связанные с этим
Где в Magento CE 1.9.0.1 обычно создается идентификатор счета?
Существуют ли известные проблемы в стандартной версии Magento CE 1.9.0.1 со встречными идентификаторами счетов для почти одновременных заказов?
Я понимаю, что инкрементный идентификатор 51986
означает, что в магазине есть какое-то расширение для изменения установленных инкрементных идентификаторов, но я хочу удостовериться, что нет научных знаний об этом, прежде чем идти слишком далеко по этому пути.
источник
save()
вызов метода в определенном событии наблюдателя, которое иногда вызывало бы эту проблему - за несколько дней до проверки кода;)Ответы:
Заказ, счет-фактура, creditmemo, доставка была EAV до 1.6 (?)
Счет-фактура @Prateek БЫЛ моделью EAV, а ее приращение по-прежнему равно.
Increment_id создание и проблема
Инкремент ID создается здесь
Я хотел бы предположить, потому что в последнем методе транзакция запускается (и таблица / строка не заблокирована), создание второго заказа может проходить и принимать тот же вновь созданный
increment_id
.Решение
Я бы предположил, что если вы заблокируете строку / таблицу перед чтением, вы можете избежать того, чтобы любой другой процесс читал таблицу, пока вы не напишите новый increment_id. Это может помочь: как заблокировать строку после использования load ()?
Но я боюсь, что блокировка строки приведет к снижению производительности.
источник