チェックアウト時にウェブサイトに問題が発生しています。私は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ロック待ちタイムアウトを超過。トランザクションを再開してみてください
低速クエリを手動で実行すると再現できますか?その場合、それをプロファイルすることができます。 –
残念ながら私は再現できませんでした。 DBホスティングは遠隔で行われます。私はそこでDBAが彼らにどんな情報を与えることができるかを聞くのを待っていました。私はここで一度更新します。 –
Magento 1.8で同じ問題が発生しました...多分、MagentoではなくUPS側で問題がありますか? – WonderLand