Pelanggaran batasan integritas: 1062 Entri duplikat untuk kunci 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

13

Saya membantu pedagang melacak akar penyebab beberapa transaksi pembayaran gagal (selama hari pesanan berat), yang gagal dengan kesalahan berikut

SQLSTATE [23000]: Pelanggaran batasan integritas: 1062 Entri duplikat '51986' untuk kunci 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

The UNQ_SALES_FLAT_INVOICE_INCREMENT_IDindeks kunci unik pada increment_idkolom dalam sales_flat_invoicetabel. Ketika saya melihat tabel ini untuk yang increment_iddisebutkan dalam kesalahan ( 51986), saya menemukan sudah ada faktur dengan ini increment_iddi sana, dan itu untuk pesanan yang dilakukan oleh pelanggan yang berbeda.

2 pertanyaan saya terkait dengan ini

  • Di mana di Magento CE 1.9.0.1 adalah ID faktur biasanya dibuat?

  • Apakah ada masalah yang diketahui dalam persediaan Magento CE 1.9.0.1 dengan coll ID ID untuk pesanan hampir bersamaan?

Saya menyadari ID kenaikan 51986berarti toko memiliki semacam ekstensi untuk mengubah ID kenaikan diinstal, tapi saya ingin memastikan tidak ada ilmu yang diketahui tanpa ini sebelum pergi terlalu jauh ke jalan itu.

Alan Storm
sumber
1
Menambahkan Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () sebagai titik debug.
Alan Storm
1
Saya pernah melihat ini sebelumnya, tapi itu karena seseorang menempatkan save()pemanggilan metode dalam acara pengamat tertentu yang kadang-kadang akan menyebabkan masalah ini - di hari-hari sebelum peninjauan kode;)
Erfan
@AlanStorm, hanya ingin tahu, mengapa pergi ke entitas Eav, saya pikir, Faktur adalah model yang datar.
Prateek
Saya percaya ini juga dapat terjadi dengan Magento standar stackoverflow.com/questions/25918091/...
Kristof di Fooman
1
Saya tahu ini lebih lama, tetapi apakah tabel eav_entity_store disalin karena alasan apa pun .. Ini adalah kesalahan umum, di mana id pesanan terakhir tidak cocok dengan pesanan yang ditempatkan saat ini. Jadi Magento menggunakan tabel eav_entity_store untuk menentukan ID apa yang akan dimasukkan ke dalam tabel pesanan, dan dalam hal ini sudah ada. Juga, perhatikan ini adalah masalah yang sangat umum dengan ekstensi nomor pesanan FooMan karena dapat melewati pemeriksaan ini dan menyebabkan masalah ini tiba-tiba.
Rob

Jawaban:

3

Pesan, faktur, kredit, pengiriman EAV hingga 1,6 (?)

Faktur @Prateek ADALAH model EAV dan increment_id masih.

Pembuatan dan masalah Increment_id

ID kenaikan dibuat di sini

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

Saya akan berasumsi karena dalam metode terakhir transaksi dimulai (dan tabel / baris tidak dikunci) kreasi urutan kedua dapat melewati dan mengambil yang sama yang baru dibuat increment_id.

Larutan

Saya akan berasumsi, bahwa jika Anda mengunci baris / tabel sebelum membaca, Anda dapat menghindari proses lain yang membaca tabel sampai Anda menulis increment_id baru. Ini mungkin membantu: Bagaimana cara mengunci baris setelah menggunakan load ()?

Tapi saya khawatir, mengunci barisan itu membuat kinerja buruk.

Fabian Blechschmidt
sumber
1
Baru saja melihat posting ini dan @Fabian, itu bagus untuk diketahui. SE juga harus memicu pemberitahuan ketika seseorang disebutkan dalam jawaban.
Prateek