В чем причина проведения переиндексации цены после размещения заказа? [дубликат]
После размещения заказа 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 ( )
И, поскольку в случае сбоя транзакции будет отправлено электронное письмо, это, по-видимому, ожидается (в противном случае это электронное письмо не было бы реализовано).
Для того, чтобы исправьте это, я перенес переиндексацию за пределы транзакции, но я все еще озадачен, зачем это нужно.
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();
}
}
}
}