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_aatable_b. - Vyplňte
table_as 500 000 řádky. - Zkopírujte data z
table_anatable_bpomocíINSERT INTO ... SELECTprohlášení. - Během procesu kopírování použijte jinou relaci k vložení nového řádku do
table_a. - Zkontrolujte, zda
table_bobsahuje 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é.