2010-07-22 2 views
1
insert into test.qvalues 
    select * from qcvalues.qvalues; 

я хотел бы knwo, если выше линии блокирует базу QCVALUESли это блокирует базу данных?

+1

Несомненно, вы имеете в виду _ «он блокирует таблицу qcvalues.qvalues?» _ Блокировка базы данных за пределами действий администратора будет очень редкими ... – Wrikken

+0

отлично, он блокирует таблицу qvalues? –

+1

Какой MySQL-движок использует таблицу? Механизм хранения MyISAM поддерживает параллельные вставки, чтобы уменьшить конфликт между читателями и писателями для данной таблицы. Http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html – Andomar

ответ

4

Для меня, документация немного непонятно:

Internal Locking Methods предполагает, что, в некоторых случаях, можно вставить таблица MyISAM в то время как другой сеанс чтение из него:

Механизм хранения MyISAM поддерживает параллельные вставки для уменьшения раздора между читателями и писателями для данной таблицы: Если таблица MyISAM не имеет свободных блоков в середине файла данных, строки всегда , вставленные в конец файла данных. В этом случае вы можете свободно смешивать параллельные инструкции INSERT и SELECT для таблицы MyISAM без замков. То есть вы можете вставлять строки в таблицу MyISAM в то же время другие клиенты читают с нее. Отверстия могут возникать из-за того, что строки были удалены или обновлены посередине таблицы. Если имеются отверстия, одновременные вставки отключены, но автоматически включаются, когда все отверстия были заполнены новыми данными .

Однако Table Locking Issues показывает ситуацию, когда таблица будет заблокирована до тех пор, SELECT, пока не завершится (это соответствует вашей ситуации):

Таблица замок также невыгодна под следующий сценарий:

  • Сессия выдает SELECT, для выполнения которой требуется много времени.
  • Другая сессия затем выдает ОБНОВЛЕНИЕ в той же таблице. Этот сеанс ожидает завершения SELECT.
  • Другая сессия вызывает другой оператор SELECT в той же таблице. Поскольку UPDATE имеет более высокий приоритет , чем SELECT, этот SELECT ожидает завершения UPDATE, после ожидания первого SELECT для завершения.

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

Вместо того, чтобы полагаться только на документацию, я попробовал немного теста:

  1. Создать две таблицы с той же структурой: table_a и table_b.
  2. Заполнить table_a с 500 000 строк.
  3. Скопируйте данные из table_a в table_b используя инструкцию INSERT INTO ... SELECT.
  4. В процессе копирования используйте другой сеанс, чтобы вставить новую строку в table_a.
  5. Проверьте, соответствует ли table_b новая запись.

Когда обе таблицы, где MyISAM, table_b не содержали новую запись после копии. Когда обе таблицы, где InnoDB, table_b, содержали новую запись после копии. Я повторял это три раза, и, как и ожидалось, результат был таким же каждый раз.

Итак, словом, если ваш стол MyISAM, он будет заблокирован. Если это InnoDB, это не так. Конечно, этот тест не рассматривает обновления, но я ожидаю, что результаты будут похожи.

Смежные вопросы