Spec-Zone.ru › MariaDB

Таблица схемы информации 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 |
+-----------+--------------------------+---------------+----------------------+-----------------+-------------+

См. также

  • блокировки метаданных
  • Таблица схемы производительности metadata_locks
  • GET_LOCK).
Содержание, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API