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

8.10.4. Блокировка метаданных

MySQL использует блокировку метаданных, чтобы управлять доступом к объектам (таблицы, триггеры, и т.д). Блокировка метаданных используется, чтобы гарантировать непротиворечивость данных, но действительно включает некоторые издержки, которые увеличиваются, как объем запроса увеличивается. Конкуренция метаданных увеличивается больше что многократные запросы пытаются получить доступ к тем же самым объектам.

Блокировка метаданных не является заменой для табличного случая определения, и его mutxes и блокировки отличаются от LOCK_open взаимное исключение. Следующее обсуждение предоставляет некоторую информацию о том, как блокировка метаданных работает.

Чтобы гарантировать сериализуемость транзакции, сервер не должен разрешить одному сеансу выполнять язык определения данных (DDL) оператор на таблице, которая используется в незаконченной транзакции в другом сеансе. Сервер достигает, это, получая метаданные соединяет таблицы, используемые в пределах транзакции и выпуска задержки тех блокировок, пока транзакция не заканчивается. Метаданные соединяются, таблица предотвращает изменения к структуре таблицы. У этого подхода блокировки есть импликация, что таблица, которая используется транзакцией в пределах одного сеанса, не может использоваться в операторах DDL другими сеансами, пока транзакция не заканчивается.

Этот принцип применяется не только к транзакционным таблицам, но также и к нетранзакционным таблицам. Предположите, что сеанс начинает транзакцию, которая использует транзакционную таблицу t и нетранзакционная таблица nt следующим образом:

START TRANSACTION;SELECT * FROM t;SELECT * FROM nt;

Блокировки метаданных сохранены на обоих t и nt пока транзакция не заканчивается. Если другой сеанс делает попытку работы DDL на любой таблице, он блокирует до выпуска блокировки метаданных в конце транзакции. Например, второй сеанс блокирует, если он делает попытку какой-либо из этих операций:

DROP TABLE t;ALTER TABLE t ...;DROP TABLE nt;ALTER TABLE nt ...;

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

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

Блокировки метаданных получаются во время a PREPARE заявление опубликовывается, как только оператор был подготовлен, даже если подготовка происходит в пределах транзакции многократного оператора.

Перед MySQL 5.5, когда транзакция, полученная эквивалент метаданных, блокируют для таблицы, используемой в пределах оператора, он выпускал блокировку в конце оператора. У этого подхода был недостаток, что, если оператор DDL произошел для таблицы, которая использовалась другим сеансом в активной транзакции, операторы могли быть записаны двоичному файлу, входят в систему неправильный порядок.