За мен документацията е малко неясна:
Методи за вътрешно заключване предполага, че при някои обстоятелства е възможно да се вмъкне в MyISAM таблица, докато друга сесия чете от нея:
Въпреки това, Проблеми със заключването на таблица показва ситуация, при която таблицата ще бъде заключена, докато SELECT завърши (това отговаря на вашата ситуация):
Таблицата InnoDB прилага заключвания на ниво ред, така че само четеният ред ще бъде заключен, а не цялата таблица.
Вместо да разчитам само на документацията, опитах малък тест:
- Създайте две таблици с една и съща структура:
table_a
иtable_b
. - Попълнете
table_a
с 500 000 реда. - Копиране на данни от
table_a
къмtable_b
с помощта наINSERT INTO ... SELECT
изявление. - По време на процеса на копиране използвайте друга сесия, за да вмъкнете нов ред в
table_a
. - Проверете дали
table_b
съдържа новия запис.
Когато и двете таблици са MyISAM, table_b
не съдържа новия запис след копието. Когато и двете таблици са InnoDB, table_b
съдържаше новия запис след копието. Повторих това три пъти и, както се очакваше, резултатът беше един и същ всеки път.
Така че, накратко, ако вашата таблица е MyISAM, тя ще бъде заключена. Ако е InnoDB, няма да стане. Разбира се, този тест не отчита актуализации, но очаквам резултатите да бъдат подобни.