2012-09-03 28 views
7

En ciertas ocasiones, cuando varios procesos de back-end suceder a correr al mismo tiempo (gestión de colas es otra cosa, puedo resolverlo así, pero esto no es la cuestión aquí), me sale General error: 1205 Lock wait timeout exceeded; try restarting transaction ROLLING BACK¿Cómo dar prioridad a ciertas consultas?

El proceso que tiene menos prioridad es el que bloquea la mesa, debido al hecho de que comenzó unos minutos antes de la prioridad alta.

¿Cómo le doy prioridad a una consulta sobre un proceso ya en ejecución?

Espero que fuera lo suficientemente claro.

Respuesta

12

Una vez que una consulta ha comenzado a ejecutarse, no se puede pausar/interrumpir. La única excepción a esto es en el nivel de administración de bases de datos donde esencialmente se puede forzar la detención de la consulta (si se quiere, se puede pensar que se trata de matar un proceso en ejecución en Windows). Sin embargo, no quieres hacer eso, así que olvídalo.

Su mejor opción sería utilizar una operación fragmentada BAJA PRIORIDAD. Básicamente, lo que eso significa es que si la consulta en LOW PRIORITY tarda demasiado en ejecutarse, piense en maneras en que podría dividirla para que sea más rápida sin crear datos huérfanos o datos ilegales en la base de datos.

Un caso de uso muy básico sería imaginar una inserción que inserta 10.000 filas nuevas. Al "fragmentar" el inserto para que ejecute el inserto varias veces con conjuntos de datos más pequeños (es decir, 500 a la vez), cada uno se completará más rápidamente y, por lo tanto, permitirá que cualquier operación de PRIORIDAD BAJA se ejecute de manera más puntual. .

Cómo

Configuración de algo tan baja prioridad es tan simple como añadir en la bandera LOW_PRIORITY.

INSERT LOW_PRIORITY INTO xxx(a,b,c,) VALUES()

UPDATE LOW_PRIORITY xxx SET a=b

DELETE LOW_PRIORITY FROM xxx WHERE a="value"

+0

bien ... ¿cómo iba a marcar una baja prioridad consulta (u puede añadir esto a la respuesta?) –

+1

añade, no lo hace usted se olvide que también será necesario Interrumpa la operación en bits más pequeños para que esto funcione, una vez que se inicia la consulta, debe finalizar para permitir que se realicen otras operaciones. LOW PRIORITY simplemente permitirá que se realicen otras consultas de prioridad normal/alta tan pronto como finalice la consulta LOW PRIORITY y antes de que se ejecute la siguiente PRIORIDAD BAJA (es decir, el segundo de la consulta fragmentada). – Lee

+1

@Lee Lo único que agregaría es información sobre la opción 'low_priority_updates' http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_low_priority_updates –

Cuestiones relacionadas