整合性制約違反:1062キー 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'のエントリが重複しています


13

私は商人が次のエラーで失敗したいくつかの支払い取引の失敗の根本原因を追跡するのを手伝っています(重い注文日中に)

SQLSTATE [23000]:整合性制約違反:1062キー 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'のエントリ '51986'が重複しています

UNQ_SALES_FLAT_INVOICE_INCREMENT_IDインデックスは、上で一意のキーであるincrement_idsales_flat_invoiceのテーブル。increment_idエラー(51986)で言及されているものをこの表で見ると、これを含む請求書がすでにincrement_idあり、別の顧客が注文したものであることがわかります。

これに関連する私の2つの質問

  • Magento CE 1.9.0.1では通常、請求書IDはどこで作成されますか?

  • ほぼ同時注文の請求書​​IDが競合するストックMagento CE 1.9.0.1に既知の問題はありますか?

インクリメントID 51986は、ストアにインストールされているインクリメントIDを変更するための何らかの拡張機能があることを意味しますが、そのパスを深く進む前に、これに対する既知の科学w / r / tがないことを確認したいと思います。


1
Mage_Eav_Model_Entity_Type :: fetchNewIncrementId()をデバッグポイントとして追加します。
アランストーム

1
これは以前にも見たことがありsave()ますが、特定のオブザーバーイベントでメソッド呼び出しを行うことにより、この問題が発生することがありました-コードレビューの前日;)
エルファン

@AlanStorm、ちょうど好奇心から、なぜEavエンティティに入るのか、Invoiceはフラットモデルだと思います。
Prateek

私は、これはまた、デフォルトのMagentoで起こることができると信じてstackoverflow.com/questions/25918091/...
Foomanでクリストフ

1
これは古いことを知っていますが、何らかの理由でコピーされたeav_entity_storeテーブルでした。これは一般的なエラーで、最後の注文IDが現在の注文と一致しません。そのため、Magentoはeav_entity_storeテーブルを使用して、オーダーテーブルに挿入するIDを決定します。この場合、すでに存在しています。また、これはFooMan注文番号拡張機能の非常に一般的な問題であり、このチェックをバイパスしてこの問題を突然発生させる可能性があることに注意してください。
ロブ

回答:


3

注文、請求書、クレジットメモ、発送は1.6(?)までEAVでした

@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

最後のメソッドではトランザクションが開始される(そしてテーブル/行がロックされない)ので、2番目のオーダーの作成が通り過ぎて同じ新しく作成されたものを取得できると思いincrement_idます。

解決

読み取る前に行/テーブルをロックすると、新しいincrement_idを書き込むまで、他のプロセスがテーブルを読み取ることを回避できると思います。これは役立つかもしれません:load()を使用した後に行をロックするにはどうすればよいですか?

しかし、行をロックするとパフォーマンスが低下するのではないかと心配しています。


1
この投稿と@Fabianをご覧ください。SEは、回答で誰かが言及されたときにも通知をトリガーする必要があります。
Prateek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.