Le clausole HIGH_PRIORITY e LOW_PRIORITY
InnoDB/XtraDB usa il locking a livello di riga per garantire l'integrità dei dati. Tuttavia alcuni Storage Engine (come MEMORY, MyISAM, Aria, MERGE) acquisiscono i lock sull'intera tabella per evitare i conflitti. Questi Storage Engine usano due code distinte per ricordare le istruzioni in attesa: una per le SELECT
e l'altra per i comandi di scrittura (INSERT
, DELETE
, UPDATE
). Per default, quest'ultima ha una priorità più elevata.
Per dare alle operazioni di scrittura una priorità più bassa, è possibile impostare la variabile low_priority_updates
a ON
. Questa opzione esiste sia a livello globale sia a livello di sessione, e può essere impostata sia all'avvio sia con l'istruzione SET
.
Quando le istruzioni di scrittura impostano troppi lock a livello di tabella, alcune SELECT
in attesa vengono eseguite. Il numero massimo dei lock in scrittura che possono essere acquisiti prima che ciò accada è determinato dalla variabile max_write_lock_count
, che è dinamica.
Se le istruzioni di scrittura hanno una priorità più alta (come da default), la priorità dei singoli comandi (INSERT
, REPLACE
, UPDATE
, DELETE
) può essere abbassata attraverso l'attributo LOW_PRIORITY
, e la priorità delle istruzioni SELECT
può essere elevata tramite l'attributo HIGH_PRIORITY
. Inoltre, LOCK TABLES
supporta un attributo LOW_PRIORITY
per i lock in scrittura.
Se le istruzioni di lettura hanno una priorità più alta, la priorità di una INSERT
può essere elevata con l'attributo HIGH_PRIORITY
. Tuttavia la priorità degli altri comandi non può essere elevata individualmente.
L'uso di LOW_PRIORITY
o HIGH_PRIORITY
per le INSERT
impedisce l'uso delle INSERT
concorrenti.