Spec-Zone .ru
спецификации, руководства, описания, API

8.10.1. Внутренние Методы Блокировки

Этот раздел обсуждает внутреннюю блокировку; то есть, блокируя выполняемый в пределах сервера MySQL непосредственно, чтобы управлять конкуренцией для табличного содержания многократными сеансами. Этот тип блокировки является внутренним, потому что это выполняется полностью сервером и не включает никакие другие программы. Для того, чтобы заблокировать выполняемый на файлах MySQL другими программами, см. Раздел 8.10.5, "Внешняя Блокировка".

Блокировка на уровне строки

MySQL использует блокировку на уровне строки для InnoDB таблицы, чтобы поддерживать одновременный доступ для записи многократными сеансами, делая их подходящий для многопользовательского, очень параллельного, и приложения OLTP.

Избегать мертвых блокировок, выполняя многократные параллельные операции записи на сингле InnoDB таблица, получите необходимые блокировки в начале транзакции, выходя a SELECT ... FOR UPDATE оператор для каждой группы строк, которые, как ожидают, будут изменены, даже если операторы DML, прибывшие позже в транзакцию. Если транзакции изменяют или блокируют больше чем одну таблицу, делают применимые заявления в том же самом порядке в пределах каждой транзакции. Мертвые блокировки влияют на производительность вместо того, чтобы представить серьезную ошибку, потому что InnoDB автоматически обнаруживает условия мертвой блокировки и откатывает одну из транзакций, на которые влияют.

Преимущества блокировки на уровне строки:

Блокировка на уровне таблицы

MySQL использует блокировку на уровне таблицы для MyISAM, MEMORY, и MERGE таблицы, позволяя только один сеанс обновить те таблицы за один раз, делая их более подходящий для только для чтения, чтения главным образом, или однопользовательских приложений.

Эти механизмы хранения избегают мертвых блокировок, всегда запрашивая все необходимые блокировки сразу в начале запроса и всегда блокируя таблицы в том же самом порядке. Компромисс - то, что эта стратегия уменьшает параллелизм; другие сеансы, которые хотят изменить таблицу, должны ожидать, пока текущий оператор DML не заканчивается.

MySQL предоставляет табличные блокировки записи следующим образом:

  1. Если есть, не соединяет таблицу, поместите запись, соединяют это.

  2. Иначе, поместите запрос блокировки в очередь блокировки записи.

MySQL предоставляет табличные блокировки чтения следующим образом:

  1. Если нет никакой записи, соединяет таблицу, поместите чтение, соединяют это.

  2. Иначе, поместите запрос блокировки в очередь блокировки чтения.

Табличным обновлениям дают более высокий приоритет чем табличные извлечения. Поэтому, когда блокировка выпускается, блокировка делается доступной для запросов в очереди блокировки записи и затем к запросам в очереди блокировки чтения. Это гарантирует, что обновления к таблице не "исчерпаны ресурсы", даже если там тяжело 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;

Преимущества блокировки на уровне таблицы:

Обычно, блокировки таблицы подходят для следующих случаев: