sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo encuentro qué transacción está causando un estado de bloqueo de metadatos de tabla en espera?

Funciona para la versión de MySql <5.7.3

SHOW ENGINE INNODB STATUS \G

Busque la Sección -

TRANSACTIONS

Podemos usar INFORMATION_SCHEMA Mesas.

Consultas útiles

Para verificar todas las transacciones de bloqueos que están esperando:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Una lista de transacciones de bloqueo:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

O

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

Una lista de bloqueos en una tabla en particular:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Una lista de transacciones en espera de bloqueos:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

Referencia - Resolución de problemas de MySQL:qué hacer cuando las consultas no funcionan , Capítulo 6 - Página 96.