注文した後に価格の再インデックスを実行する理由は何ですか? [複製

magento.stackexchange https://magento.stackexchange.com/questions/697

  •  16-10-2019
  •  | 
  •  

質問

この質問にはすでに答えがあります:

注文した後、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();
            }
        }
     }
}
ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top