Подтвердить что ты не робот

Изменить таблицу без блокировки всей таблицы

Есть ли

ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL

заблокировать всю таблицу?

4b9b3361

Ответ 1

Короткий ответ: для MySQL < 5.6 замки необходимы. Начиная с 5.6 по, и используя InnoDB, блокировки не требуются для многих операций ALTER TABLE, включая добавление столбца.


Если вы используете MySQL 5.5 или старше, он получит блокировку чтения для всей операции, а затем короткую блокировку записи в конце.

Из документации MySQL для ALTER TABLE...

В большинстве случаев ALTER TABLE создает временную копию исходной таблицы... Пока выполняется ALTER TABLE, исходная таблица может быть прочитана другими сеансами (с отмеченным исключением). Обновления и записи в таблицу, которые начинаются после начала операции ALTER TABLE, останавливаются до тех пор, пока новая таблица не будет готова...

Исключение, упомянутое ранее, заключается в том, что ALTER TABLE блокирует чтение (а не только запись) в том месте, где он готов установить новую версию файла таблицы .frm, отбросить старый файл и очистить устаревшие структуры таблиц из кеш-таблицы и таблицы. На этом этапе он должен получить эксклюзивный замок.

То есть, добавляя столбец, который он считывает, блокирует таблицу для большей части операции, а затем получает блокировку записи в конце.


MySQL 5.6 добавил Online DDL в InnoDB, который ускоряет и улучшает многие вещи, такие как изменение таблиц и индексов. Добавление столбца в таблицу больше не потребует блокировок таблиц кроме кратких эксклюзивных блокировок в начале и в конце операции.

Это должно произойти автоматически, но обязательно установите ALGORITHM=inplace и LOCK=none в оператор ALTER TABLE.

Есть одно исключение...

Таблицы InnoDB, созданные до того, как MySQL 5.6 не поддерживают ALTER TABLE... ALGORITHM = INPLACE для таблиц, содержащих временные столбцы (DATE, DATETIME или TIMESTAMP) и не были восстановлены с использованием ALTER TABLE... ALGORITHM = COPY.