2013-12-18 12 views
6

チェックアウト時にウェブサイトに問題が発生しています。私はMagento Enterprise 1.8を使用しています。私のチェックアウトモジュールはIdev's Onestepcheckoutです。Magento 1.8:顧客がチェックアウトしているときにロック待機タイムアウトが発生する

私たちが見ている問題は、eav_entity_storeテーブルがMage_Eav_Model_Entity_Typeに注文番号を返すために非常に長い時間(最大51秒)を要していることです。

私が知っていることは、これを取得するために実行されるクエリはトランザクションが 'FOR UPDATE'として実行されるため、トランザクションが完了するまでアクセスされる行がロックされることです。私は行全体がロックされている(トランザクションがコミットされるとロックが解放されるようにInnoDBを使用しています)、トランザクション全体を通してコードの他の部分だけでなくPHPコードを調べました。 51秒近くのどこかでロック待機を引き起こすはずの何か(または低速のクエリログ)。

私は、要求が積み重なって、ゆっくりと時間がたつにつれて時間が掛かると考えていましたが、クエリ時間が6msから20kまで、50kから1,2,3に変化しています。これらの日数はわずか数十であるため、100〜200件のリクエストがスタックされていることは問題ではありません。

MySqlは親ロックを使用していますが、このテーブルに関連するFKはありません。ある時点でFKですが、それ以来変更されている(これは数年前に起こった)2つのBTREEインデックスがあります。 Magento savyでない人には、eav_entity_storeテーブルの行数は50行未満で、幅はわずか5列です(4 smallintとvarchar)。テーブルサイズや不適切なインデックス作成が原因であることを真剣に疑う。しかし、TLDRの精神の中で、2つのBTREEインデックスは、この表から選択する2つの列であると言います。

1つの可能性は、2つのインデックスを複合インデックスで置き換える必要があるということです。このテーブルへの読み取りは、(FROM [インデックスAの列] AND [インデックスBの列] )。私は、行レベルのロックが、このクエリが現在テーブル上のインデックスを持つテーブル内の別の行にアクセスしないようにするかどうかはわかりません。

この時点で、根本的な問題は厳密にDBに関連していると確信するようになりましたが、これに関するMagentoまたはMySqlのアドバイスは非常に高く評価されます。これをまだ実際に読んでいる人は、私がすでにいくつかの選択肢を使い果たし、真剣にここで困惑していることをうまく考えることができます。あなたが助けてくれると思われる情報は大歓迎です。ありがとう。

編集私たちが見ている正確なエラーは次のとおりです。 エラーメッセージ:SQLSTATE [HY000]:一般的なエラー:1205ロック待ちタイムアウトを超過。トランザクションを再開してみてください

+0

低速クエリを手動で実行すると再現できますか?その場合、それをプロファイルすることができます。 –

+0

残念ながら私は再現できませんでした。 DBホスティングは遠隔で行われます。私はそこでDBAが彼らにどんな情報を与えることができるかを聞くのを待っていました。私はここで一度更新します。 –

+0

Magento 1.8で同じ問題が発生しました...多分、MagentoではなくUPS側で問題がありますか? – WonderLand

答えて

0

問題を解決しました。 MySqlの問題ではありませんでした。何らかの理由で、請求書番号の生成には猥褻な時間がかかっていました。会社はMagentoからの請求書を使用しません。それらをオフにした。問題が解決しました。請求書の生成に関する問題が具体的にどのようなものであったとしても、完全なRCAは行われませんでした。

+0

私はMagento Community 1.8.0を使用しています。私のチェックアウトモジュールはIdev's Onestepcheckoutです。同じ問題に直面して、どこで私が確認しなければならないか、または請求書フォームをオフにしなければならないか正確に私を導くことができますか? –

+1

これはおそらく修正する最良の方法ではありませんが、新しい方法でMagentoをインストールするために現在のインストールをダンプしているので、この方法で行っています。あなたがこの道を行く前に私は世話をするでしょう。Mage_Eav_Model_Entity_Type :: fetchNewIncrementIdでは、$ type = $ this-> getEntityTypeCode();行の後に150行目(私の行はファイルが変更されたために少し違います)。 if($ type === 'invoice')return 'INV0'何かを修正する方法ではなく、もう一度チェックアウトが動いています。 –

+0

あなたの助けを借りてダニーに感謝 –

関連する問題