注文した後に価格の再インデックスを実行する理由は何ですか? [複製
質問
この質問にはすでに答えがあります:
注文した後、Magentoは価格のReindex(時には時間がかかりすぎることもあります)をトリガーし、注文の配置に失敗します(Reindexはトランザクションの一部であるため):
> SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try
> restarting transaction SQL Query: INSERT INTO
> `catalog_product_index_price_tmp` SELECT
> `catalog_product_index_price`.* FROM `catalog_product_index_price`
> WHERE (entity_id IN('39074', '39075', '39076', '39077', '39078',
> '49702', '49703', '49704', '49705', '49706', '49708', '52288',
> '52289', '52291', '52292')) SQL Params: Array ( )
また、トランザクションが失敗した場合に電子メールがあるため、これは予想されるようです(そうでなければ、このメールは実装されません)。
これを修正するために、私はトランザクションの外側でレジックスを移動しましたが、私はまだこれが必要な理由を困惑させています。
解決
Magento EEのサポートは、これがティアの価格の可用性とカタログ価格設定ルールに関係していることを私に提案しました。
Magentoは製品を保存して同様のことを行います - 製品が保存されると、キャッシュがクリアされます。たとえば、Memcachedを使用している場合、キーやキャッシュタグがないため、インデックス全体がクリアされます。私が見たかなり汚れたハックがあり、時々使用されていましたが、それはキャッシュをクリアしないが、むしろキャッシュを無効にしてマークし、リフレッシュする必要がある。
そのため、ポイントに戻ると、インデックスモードを「マニュアル」に変更して自分で実行するか、できればオフピーク時間中にスケジュールで再インデックスを作成することにより、同じ結果を達成できます。このようなスクリプトの例を以下に示します。
<?php
class MyCompany_MyModule_Model_Cron {
public function schedule() {
//find dirty indexes and process
for($i=1;$i<10;$i++){
$_process = Mage::getSingleton('index/indexer')->getProcessById($i);
$_status = $_process->getStatus();
if($_status!='pending'){
$_process->reindexEverything();
}
}
}
}
所属していません magento.stackexchange