¿Cuál es la razón de la ejecución de un re-indexación de precios después de realizar un pedido? [duplicar]

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

  •  16-10-2019
  •  | 
  •  

Pregunta

Esta pregunta ya tiene una respuesta aquí:

Después de colocar una orden Magento desencadena una reindex precio (que a veces lleva demasiado tiempo) y no logra poner la orden (porque reindex es parte de la transacción):

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

Y, porque no hay un correo electrónico si falla la transacción, esto parece ser esperado (de lo contrario este mensaje no se aplicaría).

Con el fin de solucionar este problema, que se trasladó la reindex fuera de la transacción, pero todavía estoy confundido por qué esto es necesario.

¿Fue útil?

Solución

Soporte Magento EE me sugirió que esto tiene que ver con las reglas de precios sobre la disponibilidad precio grada y por catálogo.

Magento hace algo similar con el producto de ahorro - cada vez que un producto se guarda que borra la memoria caché. Si está utilizando Memcached, por ejemplo, no tiene claves o etiquetas de caché, por lo que se elimina todo el índice. Hay un truco sucio bonita que he visto, y se utiliza en ocasiones, que no obligue a la caché clara, sino más bien como marcas de la memoria caché invalidado, que necesita ser refrescado.

Así que volviendo al punto, se puede lograr el mismo resultado cambiando el modo de índice a 'manual' y funcionando por sí mismo o crear un cron para reindex en un horario, preferiblemente durante las horas de poca actividad. Un ejemplo de una secuencia de comandos se incluye a continuación:

<?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();
            }
        }
     }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top