Tivemos alguma lentidão em nossa aplicação. Quando verifiquei, descobri que uma tabela específica estava bloqueada para que todas as transações fossem rejeitadas pelo Lock wait timeout exceeded
. Quando fiz SHOW PROCESSLIST;
esperava ver alguns processos com Waiting for table level lock
estado mas não mostra nada!? apenas algumas consultas INSERT/UPDATE na mesma tabela demorando exatamente 120 segundos antes do tempo limite e outros processos no estado de suspensão (veja a imagem):
relate perguntas
-
Qual é uma boa maneira de adicionar uma PRIMARY KEY a uma grande tabela InnoDB?
-
Como converter uma tabela de 66.862.521 linhas de MyISAM para InnoDB sem ficar offline por várias horas?
-
É prática comum misturar tabelas InnoDB e MyISAM no mesmo servidor?
-
Como posso alterar o mecanismo de armazenamento padrão no phpmyadmin?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
A razão no meu caso foi que uma transação está fazendo um bloqueio de leitura em uma tabela específica levando a um "
Lock wait timeout exceeded
" porque não está confirmada. Portanto, todas as outras transações estão esperando para que essa tranx específica seja confirmada.Agora, por
SHOW PROCESSLIST;
que não mostrar nada? Na verdade, ele faz. você o encontrará (o processo) com um estado "Sleep" e sem nenhuma consulta mostrada na coluna de informações, como se fosse apenas uma conexão regular com o banco de dados.Vamos verificar meu exemplo na imagem:
Em Azul, essas são algumas consultas muito simples bloqueadas (levando 120 segundos antes de um tempo limite) e a vermelha é a transação "fantasma" ou não confirmada.
Para ver esse tipo de transação executada:
E você pode matar o processo
kill <id>;
em queTRX_QUERY
é null para liberar outras transações. No meu caso,KILL 33267342;
Certifique-se de verificar a transação não confirmada para ver se uma
commit;
ou umaRollback
cláusula está faltando para evitar esses problemas.