För mig är dokumentationen lite otydlig:
Interna låsmetoder föreslår att det under vissa omständigheter är möjligt att infoga i en MyISAM-tabell medan en annan session läser från den:
Men Tabelllåsningsproblem visar en situation där tabellen kommer att vara låst tills SELECT är klar (detta stämmer med din situation):
InnoDB-tabell implementerar lås på radnivå, så bara raden som läses kommer att låsas, snarare än hela tabellen.
I stället för att bara lita på dokumentationen testade jag ett litet test:
- Skapa två tabeller med samma struktur:
table_a
ochtable_b
. - Fyll
table_a
med 500 000 rader. - Kopiera data från
table_a
tilltable_b
med enINSERT INTO ... SELECT
uttalande. - Under kopieringsprocessen, använd en annan session för att infoga en ny rad i
table_a
. - Kontrollera om
table_b
innehåller det nya rekordet.
När båda tabellerna var MyISAM, table_b
innehöll inte den nya posten efter kopian. När båda tabellerna var InnoDB, table_b
innehöll den nya posten efter kopian. Jag har upprepat detta tre gånger, och som förväntat blev resultatet detsamma varje gång.
Så kort sagt, om ditt bord är MyISAM kommer det att vara låst. Om det är InnoDB kommer det inte att göra det. Naturligtvis tar det här testet inte hänsyn till uppdateringar, men jag förväntar mig att resultaten kommer att bli liknande.