Vi phạm ràng buộc toàn vẹn: 1062 Mục nhập trùng lặp cho khóa 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'


13

Tôi đang giúp một thương gia theo dõi nguyên nhân gốc rễ cho một số giao dịch thanh toán không thành công (trong một ngày đặt hàng nặng), đã thất bại với lỗi sau

SQLSTATE [23000]: Vi phạm ràng buộc toàn vẹn: 1062 Mục nhập trùng lặp '51986' cho khóa 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'

Các UNQ_SALES_FLAT_INVOICE_INCREMENT_IDchỉ số là một chìa khóa duy nhất trên increment_idcột trong sales_flat_invoicebảng. Khi tôi tìm trong bảng này để tìm increment_idlỗi được đề cập trong lỗi ( 51986), tôi thấy đã có một hóa đơn có increment_idtrong đó và đó là một đơn đặt hàng được đặt bởi một khách hàng khác.

2 câu hỏi của tôi liên quan đến điều này

  • Trường hợp trong Magento CE 1.9.0.1 là ID hóa đơn thường được tạo?

  • Có vấn đề nào được biết đến trong một cổ phiếu Magento CE 1.9.0.1 với ID hóa đơn va chạm cho các đơn hàng gần đồng thời không?

Tôi nhận ra ID gia tăng 51986có nghĩa là cửa hàng có một số loại tiện ích mở rộng để thay đổi ID gia tăng được cài đặt, nhưng tôi muốn chắc chắn rằng khoa học không biết đến điều này trước khi đi quá xa con đường đó.


1
Thêm Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () làm điểm gỡ lỗi.
Alan Storm

1
Tôi đã thấy điều này trước đây, nhưng đó là do ai đó đã thực hiện một save()cuộc gọi phương thức trong một sự kiện quan sát cụ thể đôi khi sẽ gây ra vấn đề này - trong những ngày trước khi xem xét mã;)
Erfan

@AlanStorm, vì tò mò, tại sao đi vào thực thể Eav, tôi nghĩ, Hóa đơn là một mô hình phẳng.
Prateek

Tôi tin rằng điều này cũng có thể xảy ra với stackover
định.com/questions/25918091/ Khăn

1
Tôi biết điều này cũ hơn, nhưng bảng eav_entity_store được sao chép vì bất kỳ lý do nào .. Đây là một lỗi phổ biến, trong đó id đơn hàng cuối cùng không khớp với thứ tự được đặt hiện tại. Vì vậy, Magento sử dụng bảng eav_entity_store để xác định ID nào cần chèn vào bảng thứ tự và trong trường hợp này nó đã tồn tại. Ngoài ra, lưu ý đây là vấn đề rất phổ biến với tiện ích mở rộng số thứ tự FooMan vì nó có thể bỏ qua kiểm tra này và khiến vấn đề này trở nên khó khăn.
Cướp

Câu trả lời:


3

Đặt hàng, hóa đơn, creditmemo, vận chuyển là EAV cho đến 1.6 (?)

Hóa đơn @Prateek là một mô hình EAV và gia số vẫn là.

Tạo và giải quyết vấn đề

ID tăng được tạo tại đây

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

Tôi sẽ giả sử bởi vì trong phương thức cuối cùng, giao dịch được bắt đầu (và bảng / hàng không bị khóa), việc tạo đơn hàng thứ hai có thể đi qua và thực hiện cùng một giao dịch mới được tạo increment_id.

Giải pháp

Tôi sẽ giả sử rằng, nếu bạn khóa hàng / bảng trước khi đọc, bạn có thể tránh bất kỳ quá trình nào khác đọc bảng cho đến khi bạn viết một số gia mới_id. Điều này có thể giúp: Làm cách nào để khóa một hàng sau khi sử dụng load ()?

Nhưng tôi sợ, việc khóa hàng đó làm mất hiệu suất xấu.


1
Chỉ cần xem bài đăng này và @Fabian, đó là điều tốt để biết. SE cũng nên kích hoạt thông báo khi ai đó được đề cập trong câu trả lời.
Prateek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.