Таблица схемы информации METADATA_LOCK_INFO
Таблица схемы информации METADATA_LOCK_INFO создаётся плагином metadata_lock_info. Она отображает активные блокировки метаданных и блокировки пользователя (блокировки, полученные с помощью GET_LOCK).
Она имеет следующие столбцы:
| Столбец | Описание |
|---|---|
THREAD_ID |
|
LOCK_MODE |
Один из MDL_INTENTION_EXCLUSIVE, MDL_SHARED, MDL_SHARED_HIGH_PRIO, MDL_SHARED_READ, MDL_SHARED_READ_ONLY, MDL_SHARED_WRITE, MDL_SHARED_NO_WRITE, MDL_SHARED_NO_READ_WRITE, MDL_SHARED_UPGRADABLE или MDL_EXCLUSIVE. |
LOCK_DURATION |
Один из MDL_STATEMENT, MDL_TRANSACTION или MDL_EXPLICIT |
LOCK_TYPE |
Один из Global read lock, Schema metadata lock, Table metadata lock, Stored function metadata lock, Stored procedure metadata lock, Trigger metadata lock, Event metadata lock, Commit lock или User lock. |
TABLE_SCHEMA |
|
TABLE_NAME |
Описание «LOCK_MODE»
Столбец LOCK_MODE может иметь следующие значения:
| Значение | Описание |
|---|---|
MDL_INTENTION_EXCLUSIVE |
Интенциональная эксклюзивная блокировка метаданных (IX). Используется только для ограниченных блокировок. Владелец этого типа блокировки может получить возможность обновления эксклюзивных блокировок на отдельных объектах. Совместима с другими блокировками IX, но несовместима с блокировками S и X для ограниченных объектов. Блокировка IX применяется в пространстве имен SCHEMA, когда мы намерены изменить метаданные объекта. Объект может ссылаться на таблицу, хранимую процедуру, триггер, представление и т.д. |
MDL_SHARED |
Общая блокировка метаданных (S). Используется в случаях, когда нас интересуют только метаданные объекта и нет намерения получать доступ к данным объекта (например, для хранимых процедур или при подготовке подготовленных операторов). Мы также используем этот тип блокировки для открытых HANDLER, так как блокировка, полученная этим оператором, должна быть совместима с блокировкой, полученной оператором LOCK TABLES ... WRITE, т.е. SNRW (мы не можем обойтись получением блокировки S в момент HANDLER ... OPEN и её обновлением до блокировки SR для HANDLER ... READ, так как это не решает проблему необходимости прерывания операторов DML, которые ожидают блокировку на уровне таблицы, имея открытый HANDLER в том же соединении). Чтобы избежать тупика, который может возникнуть, когда блокировка SNRW обновляется до блокировки X для таблицы, на которой активна блокировка S, принадлежащая потоку, который ждёт в свою очередь блокировки на уровне таблицы, принадлежащей потоку, выполняющему обновление, необходимо использовать механизм thr_abort_locks_for_thread() в такой ситуации. Эта проблема не возникает для блокировок на хранимых процедурах, так как мы не используем блокировки SNRW для них. Она также не возникает, когда блокировки S используются во время вызовов PREPARE, так как блокировки на уровне таблицы не получают в этом случае. Эта блокировка используется для глобальной блокировки чтения, при кэшировании хранимой процедуры в памяти на период транзакции и для таблиц, используемых подготовленными операторами. |
MDL_SHARED_HIGH_PRIO |
Блокировка метаданных с высоким приоритетом. Используется в случаях, когда нет намерения получить доступ к данным объекта (т.е. данным в таблице). «Высокий приоритет» означает, что, в отличие от других общих блокировок, она предоставляется, игнорируя ожидающие запросы на эксклюзивные блокировки. Предназначено для использования в тех случаях, когда нам нужно получить доступ только к метаданным, а не к данным, например, при заполнении таблицы INFORMATION_SCHEMA. Поскольку блокировка SH совместима с блокировкой SNRW, соединение, которое имеет блокировку SH, не должно пытаться получить какой-либо тип блокировки на уровне таблицы или строки, так как это может привести к тупику. Кроме того, после получения блокировки SH соединение не должно ожидать других ресурсов, так как это может привести к голоданию для блокировок X и потенциальному тупику во время обновления SNW или SNRW до блокировки X (например, если соединение, выполняющее обновление, держит ресурс, ожидаемый другим соединением). |
MDL_SHARED_READ |
Общая блокировка метаданных (SR) в случаях, когда есть намерение читать данные из таблицы. Соединение, удерживающее такой тип блокировки, может читать метаданные таблицы и данные таблицы (после получения соответствующих блокировок на уровне таблицы и строки). Это означает, что можно получить только блокировки TL_READ, TL_READ_NO_INSERT и аналогичные блокировки на уровне таблицы на таблице, если у вас есть блокировка SR MDL на ней. Используется для таблиц в операторах SELECT, подзапросах и операторах LOCK TABLE ... READ. |
MDL_SHARED_WRITE |
Общая блокировка метаданных (SW) в тех случаях, когда есть намерение изменить (а не просто прочитать) данные в таблице. Соединение, удерживающее блокировку SW, может читать метаданные таблицы и изменять или читать данные таблицы (после получения соответствующих блокировок на уровне таблицы и строки). Используется для таблиц, которые будут изменены операторами INSERT, UPDATE, DELETE, но не LOCK TABLE ... WRITE или DDL. Также используется оператором SELECT ... FOR UPDATE. |
MDL_SHARED_UPGRADABLE |
Модифицируемая общая блокировка метаданных для случаев, когда есть намерение изменить (а не просто прочитать) данные в таблице. Может быть обновлена до MDL_SHARED_NO_WRITE и MDL_EXCLUSIVE. Соединение, удерживающее блокировку SU, может читать метаданные таблицы и изменять или читать данные таблицы (после получения соответствующих блокировок на уровне таблицы и строки). Используется для первой фазы ALTER TABLE. |
MDL_SHARED_READ_ONLY |
Общая блокировка метаданных для случаев, когда нужно читать данные из таблицы и блокировать все одновременные изменения к ней (как для данных, так и для метаданных). Используется оператором LOCK TABLES READ. |
MDL_SHARED_NO_WRITE |
Модифицируемая общая блокировка метаданных, которая блокирует все попытки обновления данных таблицы, разрешая чтение. Соединение, удерживающее этот тип блокировки, может читать метаданные таблицы и читать данные таблицы. Может быть обновлена до X блокировки метаданных. Обратите внимание, что, поскольку этот тип блокировки несовместим с типами блокировок SNRW или SW, получение соответствующих блокировок на уровне движка для чтения (TL_READ* для MyISAM, общих блокировок строк в InnoDB) должно быть без конфликтов. Используется для первой фазы ALTER TABLE, при копировании данных между таблицами, для разрешения одновременных SELECT из таблицы, но не UPDATE. |
MDL_SHARED_NO_READ_WRITE |
Модифицируемая общая блокировка метаданных, которая позволяет другим соединениям получать доступ к метаданным таблицы, но не к данным. Она блокирует все попытки чтения или обновления данных таблицы, разрешая запросы INFORMATION_SCHEMA и SHOW. Соединение, удерживающее этот тип блокировки, может читать метаданные таблицы и изменять или читать данные таблицы. Может быть обновлена до X блокировки метаданных. Используется для оператора LOCK TABLES WRITE. Несовместима ни с каким другим типом блокировки, кроме S и SH. |
MDL_EXCLUSIVE |
Эксклюзивная блокировка метаданных (X). Соединение, удерживающее эту блокировку, может изменять как метаданные, так и данные таблицы. Никакой другой тип блокировки метаданных не может быть получен, пока удерживается эта блокировка. Используется для операторов CREATE/DROP/RENAME TABLE и для выполнения определённых фаз других операторов DDL. |
Примеры
Блокировка пользователя:
SELECT GET_LOCK('abc',1000);
+----------------------+
| GET_LOCK('abc',1000) |
+----------------------+
| 1 |
+----------------------+
SELECT * FROM information_schema.METADATA_LOCK_INFO;
+-----------+--------------------------+---------------+-----------+--------------+------------+
| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA | TABLE_NAME |
+-----------+--------------------------+---------------+-----------+--------------+------------+
| 61 | MDL_SHARED_NO_READ_WRITE | MDL_EXPLICIT | User lock | abc | |
+-----------+--------------------------+---------------+-----------+--------------+------------+
Блокировка метаданных таблицы:
START TRANSACTION;
INSERT INTO t VALUES (1,2);
SELECT * FROM information_schema.METADATA_LOCK_INFO \G
*************************** 1. row ***************************
THREAD_ID: 4
LOCK_MODE: MDL_SHARED_WRITE
LOCK_DURATION: MDL_TRANSACTION
LOCK_TYPE: Table metadata lock
TABLE_SCHEMA: test
TABLE_NAME: t
SELECT * FROM information_schema.METADATA_LOCK_INFO; +-----------+--------------------------+---------------+----------------------+-----------------+-------------+ | THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA | TABLE_NAME | +-----------+--------------------------+---------------+----------------------+-----------------+-------------+ | 31 | MDL_INTENTION_EXCLUSIVE | MDL_EXPLICIT | Global read lock | | | | 31 | MDL_INTENTION_EXCLUSIVE | MDL_EXPLICIT | Commit lock | | | | 31 | MDL_INTENTION_EXCLUSIVE | MDL_EXPLICIT | Schema metadata lock | dbname | | | 31 | MDL_SHARED_NO_READ_WRITE | MDL_EXPLICIT | Table metadata lock | dbname | exotics | +-----------+--------------------------+---------------+----------------------+-----------------+-------------+
См. также
Содержание, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/information-schema-metadata_lock_info-table/