Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como descubro qual transação está causando um estado de bloqueio de metadados de tabela Aguardando?


Funciona para a versão do MySQL <5.7.3
SHOW ENGINE INNODB STATUS \G

Procure a Seção -
TRANSACTIONS

Podemos usar INFORMATION_SCHEMA Tabelas.


Consultas úteis

Para verificar todas as transações de bloqueios que estão aguardando:
USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Uma lista de transações de bloqueio:
SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

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

Uma lista de bloqueios em uma tabela específica:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Uma lista de transações aguardando bloqueios:

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

Referência - Solução de problemas do MySQL:o que fazer quando as consultas não funcionam , Capítulo 6 - Página 96.