การละเมิดข้อ จำกัด ด้านความซื่อสัตย์: 1,062 รายการที่ซ้ำกันสำหรับคีย์ '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ข้อผิดพลาดที่กล่าวถึง ( 51986) ฉันพบว่ามีใบแจ้งหนี้increment_idอยู่ในนั้นแล้วและเป็นการสั่งซื้อจากลูกค้ารายอื่น

คำถาม 2 ข้อของฉันเกี่ยวข้องกับสิ่งนี้

  • โดยปกติแล้ว Magento CE 1.9.0.1 จะมีการสร้าง ID ใบแจ้งหนี้อย่างไร

  • มีปัญหาในสต็อก Magento CE 1.9.0.1 ที่มีรหัสใบแจ้งหนี้ที่ขัดแย้งกันสำหรับคำสั่งใกล้เคียงกันหรือไม่?

ฉันตระหนักถึง ID ที่เพิ่มขึ้นของ51986วิธีที่ร้านค้ามีส่วนขยายบางอย่างสำหรับการเปลี่ยนรหัสที่เพิ่มขึ้นที่ติดตั้งไว้ แต่ฉันต้องการตรวจสอบให้แน่ใจว่าไม่มีวิทยาศาสตร์ที่เป็นที่รู้จักที่ไม่มีสิ่งนี้มาก่อนที่จะลงเส้นทางนั้น


1
การเพิ่ม Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () เป็นจุดดีบัก
Alan Storm

1
ฉันเคยเห็นสิ่งนี้มาก่อน แต่เป็นเพราะมีคนsave()โทรหาวิธีการในเหตุการณ์ผู้สังเกตการณ์ที่เฉพาะเจาะจงซึ่งบางครั้งอาจทำให้เกิดปัญหานี้ - ในวันก่อนที่จะมีการตรวจสอบโค้ด)
Erfan

@ AlanStorm เพิ่งออกจากความอยากรู้ว่าทำไมจะเข้าสู่เอนทิตี้ของ Eav ฉันคิดว่าใบแจ้งหนี้เป็นรูปแบบแบน
Prateek

ฉันเชื่อว่าสิ่งนี้สามารถเกิดขึ้นได้ด้วยค่าเริ่มต้น Magento stackoverflow.com/questions/25918091/ …
Kristof ที่ Fooman

1
ฉันรู้ว่ารุ่นเก่ากว่านี้ แต่ถูกคัดลอกตาราง eav_entity_store ไม่ว่าด้วยเหตุผลใดก็ตามนี่เป็นข้อผิดพลาดทั่วไปโดยที่รหัสคำสั่งซื้อล่าสุดไม่ตรงกับคำสั่งที่วางไว้ปัจจุบัน ดังนั้นวีโอไอพีจึงใช้ตาราง eav_entity_store เพื่อกำหนด ID ที่จะแทรกในตารางคำสั่งซื้อและในกรณีนี้มันมีอยู่แล้ว นอกจากนี้โปรดทราบว่านี่เป็นปัญหาที่พบบ่อยมากกับส่วนขยายหมายเลขสั่งซื้อ FooMan เนื่องจากสามารถข้ามการตรวจสอบนี้และทำให้ปัญหานี้ออกจากสีน้ำเงิน
Rob

คำตอบ:


3

สั่งซื้อ, ใบแจ้งหนี้, เครดิต, การจัดส่งสินค้าคือ EAV จนถึง 1.6 (?)

@Prateek ใบแจ้งหนี้เป็นรูปแบบ EAV และ increment_id ยังคงเป็น

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.