Блокировка метаданных
MariaDB поддерживает блокировку метаданных. Это означает, что при использовании таблицы транзакцией (включая XA-транзакции) блокируются её метаданные до конца транзакции. Также блокируются нетранзакционные таблицы, а также представления и объекты, связанные с заблокированными таблицами/представлениями (хранимые функции, триггеры и т. д.). Когда соединение пытается выполнить оператор DDL (например, ALTER TABLE), изменяющий заблокированную таблицу, это соединение ставится в очередь и должно ждать, пока таблица не будет разблокирована. Использование точек сохранения и частичное откат не разблокирует метаданные.
LOCK TABLES ... WRITE также ставится в очередь. Некоторые неправильные операторы, которые вызывают ошибку, могут не ждать освобождения блокировки.
Время ожидания блокировки метаданных определяется значением системной переменной сервера lock_wait_timeout (в секундах). Однако обратите внимание, что её значение по умолчанию составляет 31536000 (1 год, MariaDB <= 10.2.3) или 86400 (1 день, MariaDB >= 10.2.4). Если это время ожидания превышено, возвращается следующая ошибка:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Если плагин metadata_lock_info установлен, таблица Информационной схемы metadata_lock_info хранит информацию о существующих блокировках метаданных.
Начиная с MariaDB 10.5, таблица Performance Schema metadata_locks содержит информацию о блокировках метаданных.
Пример
Давайте используем следующую таблицу MEMORY (нетранзакционную):
CREATE TABLE t (a INT) ENGINE = MEMORY;
Соединение 1 начинает транзакцию и выполняет INSERT в таблицу t:
START TRANSACTION; INSERT INTO t SET a=1;
t метаданные теперь заблокированы соединением 1. Соединение 2 пытается изменить t, но должно ждать:
ALTER TABLE t ADD COLUMN b INT;
Запрос соединения 2 заблокирован.
Теперь соединение 1 завершает транзакцию:
COMMIT;
...и соединение 2, наконец, получает результат своей команды:
Query OK, 1 row affected (35.23 sec) Records: 1 Duplicates: 0 Warnings: 0
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/metadata-locking/