Dla mnie dokumentacja jest trochę niejasna:
Wewnętrzne metody blokowania sugeruje, że w pewnych okolicznościach możliwe jest wstawienie do tabeli MyISAM, podczas gdy inna sesja odczytuje z niej:
Jednak Problemy z blokowaniem tabeli pokazuje sytuację, w której stół zostanie zablokowany do momentu zakończenia SELECT (to pasuje do Twojej sytuacji):
Tabela InnoDB implementuje blokady na poziomie wiersza, więc blokowany będzie tylko wiersz, który jest odczytywany, a nie cała tabela.
Zamiast polegać tylko na dokumentacji, wykonałem mały test:
- Utwórz dwie tabele o tej samej strukturze:
table_a
itable_b
. - Wypełnij
table_a
z 500 000 wierszy. - Skopiuj dane z
table_a
dotable_b
używającINSERT INTO ... SELECT
oświadczenie. - Podczas kopiowania użyj innej sesji, aby wstawić nowy wiersz do
table_a
. - Sprawdź, czy
table_b
zawiera nowy rekord.
Gdy obie tabele zawierają MyISAM, table_b
nie zawierał nowego rekordu po kopii. Gdy obie tabele zawierają InnoDB, table_b
zawierał nowy rekord po kopii. Powtórzyłem to trzy razy i zgodnie z oczekiwaniami wynik za każdym razem był taki sam.
Krótko mówiąc, jeśli Twój stół to MyISAM, zostanie zablokowany. Jeśli to InnoDB, to nie. Oczywiście ten test nie uwzględnia aktualizacji, ale spodziewam się, że wyniki będą podobne.