HIGH_PRIORITY and LOW_PRIORITY clauses
InnoDB/XtraDB uses row-level locking to grant data integrity. However some storage engines (like MEMORY, MyISAM, Aria, MERGE) lock the whole table to prevent conflicts. These storage engines use two separate queues to remember pending statements: one is for SELECT
s and the other one is for write statements (INSERT
, DELETE
, UPDATE
). By default, the latter has a higher priority.
To give write operations a lower priority, the low_priority_updates
server system variable can be set to ON
. The option is both global and session level, and it can be set both at startup or via the SET
statement.
When too many table locks have been set by write statements, some pending SELECT
s are executed. The maximum number of write locks that can be acquired before this happens is determined by the max_write_lock_count
server system variable, which is dynamic.
If write statements have a higher priority (default), the priority of individual write statements (INSERT
, REPLACE
, UPDATE
, DELETE
) can be changed via the LOW_PRIORITY
attribute, and the priority of a SELECT
statement can be raised via the HIGH_PRIORITY
attribute. Also, LOCK TABLES
supports a LOW_PRIORITY
attribute for WRITE
locks.
If read statements have a higher priority, the priority of an INSERT
can be changed via the HIGH_PRIORITY
attribute. However, the priority of other wrtie statements cannot be raised individually.
The use of LOW_PRIORITY
or HIGH_PRIORITY
for an INSERT
prevents the concurrent INSERT
s to be used.