Metadata locking has been supported since MariaDB 5.5. This means that when a transaction (including XA transactions) uses a table, it locks its metadata until the end of transaction. Non-transactional tables are also locked, as well as views and objects which are related to locked tables/views (stored functions, triggers, etc). When a connection tries to use a DDL statement (like an
ALTER TABLE) which modifies a table that is locked, that connection is queued, and has to wait until it's unlocked. Using savepoints and performing a partial rollback does not release metadata locks.
LOCK TABLES ... WRITE are also queued. Some wrong statements which produce an error may not need to wait for the lock to be freed.
Metadata lock's timeout is determined by the value of the lock_wait_timeout server system variable (in seconds). However, note that its default value is 31536000 (1 year, MariaDB <= 10.2.3), or 86400 (1 day, MariaDB >= 10.2.4). If this timeout exceeds, the following error is returned:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Let's use the following MEMORY (non-transactional) table:
CREATE TABLE t (a INT) ENGINE = MEMORY;
Connection 1 starts a transaction, and INSERTs a row into t:
START TRANSACTION; INSERT INTO t SET a=1;
t's metadata is now locked by connection 1. Connection 2 tries to alter
t, but has to wait:
ALTER TABLE t ADD COLUMN b INT;
Connection 2's prompt is blocked now.
Now connection 1 ends the transaction:
...and connection 2 finally gets the output of its command:
Query OK, 1 row affected (35.23 sec) Records: 1 Duplicates: 0 Warnings: 0