Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел обсуждает внутреннюю блокировку; то есть, блокируя выполняемый в пределах сервера MySQL непосредственно, чтобы управлять конкуренцией для табличного содержания многократными сеансами. Этот тип блокировки является внутренним, потому что это выполняется полностью сервером и не включает никакие другие программы. Для того, чтобы заблокировать выполняемый на файлах MySQL другими программами, см. Раздел 8.10.5, "Внешняя Блокировка".
MySQL использует блокировку на уровне
строки для InnoDB
таблицы, чтобы поддерживать одновременный доступ для записи
многократными сеансами, делая их подходящий для многопользовательского, очень параллельного, и приложения OLTP.
Избегать мертвых блокировок, выполняя
многократные параллельные операции записи на сингле InnoDB
таблица, получите
необходимые блокировки в начале транзакции, выходя a SELECT ... FOR UPDATE
оператор
для каждой группы строк, которые, как ожидают, будут изменены, даже если операторы DML,
прибывшие позже в транзакцию. Если транзакции изменяют или блокируют больше чем одну таблицу, делают применимые
заявления в том же самом порядке в пределах каждой транзакции. Мертвые блокировки влияют на производительность
вместо того, чтобы представить серьезную ошибку, потому что InnoDB
автоматически обнаруживает
условия мертвой блокировки и откатывает одну из транзакций, на которые влияют.
Преимущества блокировки на уровне строки:
Меньше блокировки конфликтует когда различный доступ сеансов различные строки.
Меньше изменений для откатов.
Возможный блокировать единственную строку в течение долгого времени.
MySQL использует блокировку на уровне
таблицы для MyISAM
, MEMORY
, и MERGE
таблицы, позволяя только один сеанс обновить те таблицы за один раз, делая их
более подходящий для только для чтения, чтения главным образом, или однопользовательских приложений.
Эти механизмы хранения избегают мертвых блокировок, всегда запрашивая все необходимые блокировки сразу в начале запроса и всегда блокируя таблицы в том же самом порядке. Компромисс - то, что эта стратегия уменьшает параллелизм; другие сеансы, которые хотят изменить таблицу, должны ожидать, пока текущий оператор DML не заканчивается.
MySQL предоставляет табличные блокировки записи следующим образом:
Если есть, не соединяет таблицу, поместите запись, соединяют это.
Иначе, поместите запрос блокировки в очередь блокировки записи.
MySQL предоставляет табличные блокировки чтения следующим образом:
Если нет никакой записи, соединяет таблицу, поместите чтение, соединяют это.
Иначе, поместите запрос блокировки в очередь блокировки чтения.
Табличным обновлениям дают более высокий приоритет чем табличные извлечения. Поэтому, когда блокировка
выпускается, блокировка делается доступной для запросов в очереди блокировки записи и затем к запросам в очереди
блокировки чтения. Это гарантирует, что обновления к таблице не "исчерпаны ресурсы",
даже если там тяжело SELECT
действие для таблицы. Однако, если у Вас есть много обновлений для
таблицы, SELECT
операторы ожидают, пока нет больше обновлений.
Для получения информации об изменении приоритета чтений и записей, см. Раздел 8.10.2, "Табличные Проблемы Блокировки".
Можно проанализировать конкуренцию блокировки таблицы на своей системе, проверяя Table_locks_immediate
и Table_locks_waited
переменные состояния, которые указывают на число раз, которое
запрашивает на блокировки таблицы, можно было сразу предоставить и число, которое должно было ожидать,
соответственно:
mysql> SHOW STATUS LIKE 'Table%';
+-----------------------+---------+| Variable_name | Value |+-----------------------+---------+| Table_locks_immediate | 1151552 || Table_locks_waited | 15324 |+-----------------------+---------+
MyISAM
механизм хранения поддерживает параллельные вставки, чтобы уменьшить
конкуренцию между читателями и писателями для данной таблицы: Если a MyISAM
у
таблицы нет никаких свободных блоков в середине файла данных, строки всегда вставляются в конце файла данных. В
этом случае можно свободно смешаться параллельный INSERT
и SELECT
операторы для a MyISAM
таблица без блокировок. Таким образом, можно вставить строки
в a MyISAM
таблица одновременно другие клиенты читает из этого. Дыры могут
следовать из строк, удаленных из или обновленный в середине таблицы. Если есть дыры, параллельные вставки
отключаются, но включаются снова автоматически, когда все дыры были заполнены новыми данными.. Это поведение
изменяется concurrent_insert
системная переменная. См. Раздел 8.10.3, "Параллельные
Вставки".
Если Вы получаете блокировку таблицы явно с LOCK TABLES
, можно запросить a READ LOCAL
блокировка, а не a READ
блокировка, чтобы позволить другим сеансам выполнить
параллельные вставки, в то время как Вам заблокировали таблицу.
Выполнять многих INSERT
и SELECT
операции на таблице real_table
когда параллельные вставки не возможны, можно
вставить строки во временную таблицу temp_table
и обновите реальную таблицу со
строками из временной таблицы периодически. Это может быть сделано со следующим кодом:
mysql>LOCK TABLES real_table WRITE, temp_table WRITE;
mysql>INSERT INTO real_table SELECT * FROM temp_table;
mysql>DELETE FROM temp_table;
mysql>UNLOCK TABLES;
Преимущества блокировки на уровне таблицы:
Требует относительно небольшого количества памяти.
Быстро когда использующийся на значительной части таблицы, потому что только единственная блокировка включается.
Быстро, если Вы часто делаете GROUP BY
операции на
значительной части данных или если следует часто сканировать всю таблицу.
Обычно, блокировки таблицы подходят для следующих случаев:
Большинство операторов для таблицы является чтениями.
Операторы для таблицы являются соединением чтений и записей, где записи являются обновлениями, или удаляет для единственной строки, которая может быть выбрана с одним ключевым чтением:
UPDATEtbl_name
SETcolumn
=value
WHEREunique_key_col
=key_value
;DELETE FROMtbl_name
WHEREunique_key_col
=key_value
;
SELECT
объединенный с параллельным INSERT
операторы, и очень немногие UPDATE
или DELETE
операторы.
Много сканирований или GROUP BY
операции на всей
таблице без любых писателей.