Metadata Locking
A partire da MariaDB 5.5, è supportato il locking dei metadati. Questo significa che se una transazione utilizza una tabella, acquisisce un lock sui suoi metadati fino al termine della transazione. Ciò avviene anche per le tabelle non transazionali, per le viste e per gli oggetti che sono collegati alle tabelle o alle viste (Stored Function, Trigger, etc). Quando una transazione tenta di lanciare un'istruzione DDL (come ALTER TABLE) che modifica una tabella i cui metadati sono bloccati, quella connessione viene messa in coda, e deve attendere il rilascio del lock.
Anche le istruzioni LOCK TABLES ... WRITE sono accodate. Alcune istruzioni che producono un errore potrebbero non avere bisogno di attendere.
Il timeout del lock dei metadati è determinato dal valore della variabile server di sistema lock_wait_timeout (in secondi). Tuttavia, si noti che il suo valore predefinito è 31536000 (1 anno). Allo scadere del timeout, si ottiene il seguente errore:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Esempio
Utilizziamola seguente tabella MEMORY (non transazionale):
CREATE TABLE t (a INT) ENGINE = MEMORY;
La connessione 1 avvia una transazione e inserisce una riga in t:
MariaDB [test]> START TRANSACTION; MariaDB [test]> INSERT INTO t SET a=1;
Vi è ora un lock sui metadati di t
, acquisito dalla connessione 1. La connessione 2 tenta di modificare t
, ma deve aspettare:
MariaDB [test]> ALTER TABLE t ADD COLUMN b INT;
Il prompt della connessione 2 è ora bloccato.
Ora la connessione 1 termina la transazione:
MariaDB [test]> COMMIT;
...e la connessione 2 ottiene finalmente l'output del suo comando:
Query OK, 1 row affected (35.23 sec) Records: 1 Duplicates: 0 Warnings: 0