Que condições acionam um bloqueio no nível da tabela

2

Trabalhando em alguns problemas de desempenho do vBulletin, me deparei com essa situação, em que tudo fica preso esperando em um bloqueio no nível de tabela:

 Id  Command Time State                       Info
 83  Query   47  Writing to net               SELECT /*!40001 SQL_NO_CACHE */ * FROM 'post'
 87  Query   117 Waiting for table level lock UPDATE session     SET lastactivity = 1362132185, location = '/for
 89  Query   116 Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '178.1
 90  Query   113 Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '66.24
 94  Query   108 Waiting for table level lock select userid from session where sessionhash = '2269de072969ab9d42
 96  Query   102 Waiting for table level lock SELECT *    FROM session    WHERE sessionhash = 'b0e3d290e9f609160
129  Query   15  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '65.55
130  Query   14  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '71.19
132  Query   13  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '178.1

Normalmente, o padrão para diagnosticar problemas de bloqueio é descobrir qual consulta não está bloqueada e, em geral, seu culpado. Mas, neste caso, ele está lendo uma tabela não relacionada, e a consulta que está sendo executada há mais tempo (o que certamente faz parte do problema, já que é a única consulta de atualização) também está bloqueada.

Portanto, a pergunta é: que condições adicionais podem causar a aplicação de um bloqueio no nível da tabela que você poderia esperar de uma situação como a que é vista aqui.

Detalhes do Add'l
Isto é sobre uma instalação padrão do mysql; sem particionamento ou outras travessuras envolvidas | Tabela posts é tipo MyISAM
Tabela session é tipo MEMORY
Outras questões (como a ineficácia gritante da consulta 83 ou a inadvisibilidade de usar o MyISAM) são interessantes, mas não o que está sendo perguntado.

O texto completo da consulta 87 é assim:

Query UPDATE session SET lastactivity = 1362132185, location = '/forums/forumdisplay.php?f=421', inforum = 421, inthread = 0, incalendar = 0, badlocation = 0 WHERE sessionhash = 'e6322935fe2df18106878473f310d91f'
    
por tylerl 01.03.2013 / 18:49

1 resposta

2

O mysqldump está rodando no momento do bloqueio? Parece que o thread 83 pode estar atualmente exportando post , mas pode ter chamado LOCK TABLES no banco de dados para obter uma posição consistente em todas as tabelas.

    
por 01.03.2013 / 19:10