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


После размещения заказа Magento запускает переиндексацию цены (которая иногда занимает слишком много времени) и не выполняет размещение заказа (поскольку переиндексация является частью транзакции):

> 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 ( )

И, поскольку в случае сбоя транзакции будет отправлено электронное письмо, это, по-видимому, ожидается (в противном случае это электронное письмо не было бы реализовано).

Для того, чтобы исправьте это, я перенес переиндексацию за пределы транзакции, но я все еще озадачен, зачем это нужно.

Author: Aasim Goriya, 2013-02-12

1 answers

Поддержка 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();
            }
        }
     }
}
 3
Author: philwinkle, 2013-02-12 15:44:25