Какова причина для запуска цены реиндекса после размещения заказа? [дублировать
Вопрос
Этот вопрос уже имеет ответ здесь:
После размещения заказа 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();
}
}
}
}