try transaction solucion restarting lock innodb_lock_wait_timeout exceeded error mysql sql timeout lock-timeout

mysql - transaction - Obteniendo "Tiempo de espera de espera de bloqueo excedido"; intente reiniciar la transacción "aunque no estoy usando una transacción



lock wait timeout exceeded try restarting transaction solucion (13)

Estoy ejecutando la siguiente instrucción UPDATE MySQL:

mysql> update customer set account_import_id = 1; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

No estoy usando una transacción, entonces ¿por qué recibiría este error? Incluso probé a reiniciar mi servidor MySQL y no me ayudó.

La tabla tiene 406,733 filas.


¿Se puede actualizar cualquier otro registro dentro de esta tabla, o esta tabla se usa mucho? Lo que estoy pensando es que mientras está intentando adquirir un bloqueo que necesita para actualizar este registro, se agotó el tiempo de espera establecido. Puede aumentar el tiempo que puede ayudar.


100% con lo que dijo MarkR. autocommit hace que cada declaración sea una transacción de declaración.

SHOW ENGINE INNODB STATUS debería darle algunas pistas sobre el motivo del punto muerto. Eche un vistazo a su lento registro de consultas también para ver qué más está consultando la tabla y trate de eliminar todo lo que esté haciendo un tablescan completo. El bloqueo del nivel de fila funciona bien, pero no cuando está intentando bloquear todas las filas.


Asegúrese de que las tablas de la base de datos estén usando el motor de almacenamiento InnoDB y el nivel de aislamiento de transacción LÉALO COMPROMETIDO.

Puede verificarlo con SELECT @@ GLOBAL.tx_isolation, @@ tx_isolation; en la consola de mysql

Si no está configurado para ser LEÍDO-COMPROMETIDO, entonces debe configurarlo. Asegúrese antes de configurarlo de que tiene privilegios SUPER en mysql.

Puede obtener ayuda de http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html .

Al configurar esto, creo que su problema se resolverá.

También es posible que desee comprobar que no está intentando actualizar esto en dos procesos a la vez. Los usuarios (@tala) han encontrado mensajes de error similares en este contexto, quizás doblemente que ...


Eche un vistazo si su base de datos está afinada. Especialmente el aislamiento de transacciones. No es buena idea aumentar la variable innodb_lock_wait_timeout.

Verifique el nivel de aislamiento de transacciones de su base de datos en mysql cli:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation; +-----------------------+-----------------+------------------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | @@session.tx_isolation | +-----------------------+-----------------+------------------------+ | REPEATABLE-READ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+------------------------+ 1 row in set (0.00 sec)

Podría obtener mejoras cambiando el nivel de aislamiento, use el oráculo como READ COMMITTED en lugar de REPEATABLE READ (InnoDB Defaults)

mysql> SET tx_isolation = ''READ-COMMITTED''; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL tx_isolation = ''READ-COMMITTED''; Query OK, 0 rows affected (0.00 sec) mysql>

También intente usar SELECCIONAR PARA ACTUALIZAR solo en caso de ser necesario.


El número de filas no es enorme ... Cree un índice en account_import_id si no es la clave principal.

CREATE INDEX idx_customer_account_import_id ON customer (account_import_id);


Estás usando una transacción; autocommit no deshabilita las transacciones, solo las hace confirmar automáticamente al final de la instrucción.

Lo que está sucediendo es que algún otro hilo mantiene un bloqueo de registro en algún registro (¡estás actualizando cada registro en la tabla!) Durante demasiado tiempo, y tu hilo se está agotando.

Puede ver más detalles del evento emitiendo un

SHOW ENGINE INNODB STATUS/G

después del evento. Lo ideal sería hacer esto en una máquina de prueba silenciosa.


Este tipo de cosas me sucedieron cuando estaba usando la salida de construcción del lenguaje php; en medio de la transacción. Entonces, esta transacción "se bloquea" y debes matar al proceso de mysql (descrito anteriormente con la lista de procesos;)


Ninguna de las soluciones sugeridas funcionó para mí, pero esto fue así.

Algo está bloqueando la ejecución de la consulta. Lo más probable es que otra consulta actualice, inserte o elimine de una de las tablas en su consulta. Tienes que descubrir qué es eso:

SHOW PROCESSLIST;

Una vez que encuentre el proceso de bloqueo, encuentre su id y ejecute:

KILL {id};

Vuelve a ejecutar tu consulta inicial.


Si no tiene nada más en ejecución y es su propia instancia, creo que sería más eficiente reiniciar mysql


Tarde en la fiesta (como de costumbre) sin embargo, mi problema fue el hecho de que escribí algunos SQL incorrectos (siendo un novato) y varios procesos tenían un bloqueo en los registros <- no estoy seguro de la verborrea apropiada. Terminé teniendo que simplemente: SHOW PROCESSLIST y luego matar los ID usando KILL <id>


Tenía este mismo error, aunque solo estaba actualizando una tabla con una entrada, pero después de reiniciar mysql, se resolvió.


CÓMO FORZAR DESBLOQUEO para tablas bloqueadas en MySQL:

Romper bloqueos como este puede hacer que la atomicity en la base de datos no se aplique en las sentencias SQL que causaron el bloqueo.

Esto es hackish, y la solución adecuada es arreglar su aplicación que causó los bloqueos. Sin embargo, cuando hay dólares en juego, una patada rápida hará que las cosas se muevan nuevamente.

1) Ingrese MySQL

mysql -u your_user -p

2) Veamos la lista de tablas bloqueadas

mysql> show open tables where in_use>0;

3) Veamos la lista de los procesos actuales, uno de ellos es bloquear su mesa (s)

mysql> show processlist;

4) Mata uno de estos procesos

mysql> kill <put_process_id_here>;


mysql> set innodb_lock_wait_timeout=100 Query OK, 0 rows affected (0.02 sec) mysql> show variables like ''innodb_lock_wait_timeout''; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | innodb_lock_wait_timeout | 100 | +--------------------------+-------+

Ahora activa el bloqueo nuevamente. Tiene 100 segundos para emitir un SHOW ENGINE INNODB STATUS/G a la base de datos y ver qué otra transacción está bloqueando la suya.