Какова причина для запуска цены реиндекса после размещения заказа? [дублировать

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

  •  16-10-2019
  •  | 
  •  

Вопрос

Этот вопрос уже имеет ответ здесь:

После размещения заказа Magento запускает реиндекс цены (который иногда занимает слишком много времени) и не в состоянии размещать заказ (потому что 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, у вас нет ключей или тегов кэша, поэтому весь индекс очищается. Есть довольно грязный хак, который я видел и использовал время от времени, который не заставляет кэш ясен, а скорее отмечает кэш как недействительный, нуждающийся в обновлении.

Таким образом, возвращаясь к точке, вы можете достичь того же результата, изменив режим индекса на «ручное» и запустив его самостоятельно или создав Cron для реиндекса по расписанию, предпочтительно в непиковые часы. Пример такого сценария включен ниже:

<?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