Нарушение ограничения целостности: 1062 Повторяющаяся запись для ключа 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

13

Я помогаю продавцу отследить причину некоторых неудачных платежных транзакций (в течение тяжелого дня заказа), которые завершились следующей ошибкой

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означает, что в магазине есть какое-то расширение для изменения установленных инкрементных идентификаторов, но я хочу удостовериться, что нет научных знаний об этом, прежде чем идти слишком далеко по этому пути.

Алан Сторм
источник
1
Добавление Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () в качестве точки отладки.
Алан Сторм
1
Я видел это раньше, но это было из-за того, что кто-то сделал save()вызов метода в определенном событии наблюдателя, которое иногда вызывало бы эту проблему - за несколько дней до проверки кода;)
Эрфан
@AlanStorm, просто из любопытства, почему, входя в сущность Eav, я думаю, Invoice - плоская модель.
Prateek
Я полагаю, что это также может случиться со стандартным Magento stackoverflow.com/questions/25918091/…
Кристоф на Fooman
1
Я знаю, что это старше, но была ли таблица eav_entity_store скопирована по любой причине ... Это распространенная ошибка, когда идентификатор последнего ордера не совпадает с текущим размещенным ордером. Таким образом, Magento использует таблицу eav_entity_store, чтобы определить, какой ID вставить в таблицу заказов, и в этом случае она уже существует. Кроме того, обратите внимание, что это очень распространенная проблема с расширением номера заказа FooMan, поскольку она может обойти эту проверку и вызвать эту проблему на ровном месте.
Роб

Ответы:

3

Заказ, счет-фактура, creditmemo, доставка была EAV до 1.6 (?)

Счет-фактура @Prateek БЫЛ моделью EAV, а ее приращение по-прежнему равно.

Increment_id создание и проблема

Инкремент ID создается здесь

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

Я хотел бы предположить, потому что в последнем методе транзакция запускается (и таблица / строка не заблокирована), создание второго заказа может проходить и принимать тот же вновь созданный increment_id .

Решение

Я бы предположил, что если вы заблокируете строку / таблицу перед чтением, вы можете избежать того, чтобы любой другой процесс читал таблицу, пока вы не напишите новый increment_id. Это может помочь: как заблокировать строку после использования load ()?

Но я боюсь, что блокировка строки приведет к снижению производительности.

Фабиан Блехшмидт
источник
1
Только что видел этот пост и @Fabian, это приятно знать. SE также должен вызывать уведомления, когда кто-то упоминается в ответе.
Prateek