For mig er dokumentationen lidt uklar:
Interne låsemetoder foreslår, at det i nogle tilfælde er muligt at indsætte i en MyISAM-tabel, mens en anden session læser fra den:
Men Tabellåsningsproblemer viser en situation, hvor bordet vil være låst, indtil SELECT er fuldført (dette passer med din situation):
InnoDB-tabel implementerer rækkeniveaulåse, så kun den række, der læses, vil blive låst, i stedet for hele tabellen.
I stedet for kun at stole på dokumentationen prøvede jeg en lille test:
- Opret to tabeller med samme struktur:
table_a
ogtable_b
. - Udfyld
table_a
med 500.000 rækker. - Kopiér data fra
table_a
tiltable_b
ved hjælp af enINSERT INTO ... SELECT
erklæring. - Under kopieringsprocessen skal du bruge en anden session til at indsætte en ny række i
table_a
. - Tjek om
table_b
indeholder den nye rekord.
Når begge tabeller var MyISAM, table_b
indeholdt ikke den nye post efter kopien. Når begge tabeller var InnoDB, table_b
indeholdt den nye post efter kopien. Jeg har gentaget dette tre gange, og som forventet blev resultatet det samme hver gang.
Så kort sagt, hvis dit bord er MyISAM, vil det være låst. Hvis det er InnoDB, vil det ikke. Selvfølgelig tager denne test ikke højde for opdateringer, men jeg forventer, at resultaterne vil være ens.