Pro mě je dokumentace trochu nejasná:
Metody vnitřního zamykání navrhuje, že za určitých okolností je možné vložit do tabulky MyISAM, když z ní čte jiná relace:
Nicméně Problémy se zamykáním tabulek ukazuje situaci, kdy bude tabulka uzamčena, dokud nebude SELECT dokončen (to odpovídá vaší situaci):
Tabulka InnoDB implementuje zámky na úrovni řádků, takže bude uzamčen pouze čtený řádek, nikoli celá tabulka.
Spíše než se spoléhat jen na dokumentaci, zkusil jsem malý test:
- Vytvořte dvě tabulky se stejnou strukturou:
table_a
atable_b
. - Vyplňte
table_a
s 500 000 řádky. - Zkopírujte data z
table_a
natable_b
pomocíINSERT INTO ... SELECT
prohlášení. - Během procesu kopírování použijte jinou relaci k vložení nového řádku do
table_a
. - Zkontrolujte, zda
table_b
obsahuje nový záznam.
Když obě tabulky obsahují MyISAM, table_b
neobsahoval nový záznam po kopii. Když obě tabulky obsahují InnoDB, table_b
obsahoval nový záznam po kopii. Opakoval jsem to třikrát a podle očekávání byl výsledek pokaždé stejný.
Stručně řečeno, pokud je váš stůl MyISAM, bude uzamčen. Pokud je to InnoDB, nebude. Tento test samozřejmě nezohledňuje aktualizace, ale očekávám, že výsledky budou podobné.