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

isso bloqueia o banco de dados?


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:
  1. Crie duas tabelas com a mesma estrutura:table_a e table_b .
  2. Preencha table_a com 500.000 linhas.
  3. Copiar dados de table_a para table_b usando um INSERT INTO ... SELECT declaração.
  4. Durante o processo de cópia, use outra sessão para inserir uma nova linha em table_a .
  5. 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.