Para mim, a documentação é um pouco obscura:
Métodos de bloqueio interno sugere que, em algumas circunstâncias, é possível inserir em uma tabela MyISAM enquanto outra sessão está lendo a partir dela:
No entanto, Problemas de bloqueio de tabela mostra uma situação em que a tabela ficará bloqueada até que o SELECT seja concluído (isso se encaixa na sua situação):
A tabela InnoDB implementa bloqueios em nível de linha, portanto, apenas a linha que está sendo lida será bloqueada, em vez de toda a tabela.
Em vez de confiar apenas na documentação, fiz um pequeno teste:
- Crie duas tabelas com a mesma estrutura:
table_a
etable_b
. - Preencha
table_a
com 500.000 linhas. - Copiar dados de
table_a
paratable_b
usando umINSERT INTO ... SELECT
declaração. - Durante o processo de cópia, use outra sessão para inserir uma nova linha em
table_a
. - Verifique se
table_b
contém o novo registro.
Quando ambas as tabelas são MyISAM,
table_b
não continha o novo registro após a cópia. Quando ambas as tabelas são InnoDB, table_b
continha o novo registro após a cópia. Repeti isso três vezes e, como esperado, o resultado foi o mesmo todas as vezes. Então, resumindo, se sua mesa for MyISAM, ela será bloqueada. Se for InnoDB, não. Claro, este teste não considera atualizações, mas espero que os resultados sejam semelhantes.