HIGH_PRIORITY和LOW_PRIORITY
Contents
XtraDB/InnoDB存储引擎使用行级锁来保证数据的完整性。但有些存储引擎(例如MEMORY、MyISAM、Aria和MERGE)使用表级锁将整个表锁住以防止锁冲突。这些使用表锁的存储引擎使用两种独立的队列来记住队列中的语句;一个队列是为读数据SELECTs
语句准备,一个队列是为写数据(INSERT
、DELETE
、UPDATE
)准备。默认情况下,后者比前者优先级更高。也就是说,如果队列中既有读操作,又有写操作,将先执行所有的写操作,执行完后才执行读操作。
如果想让写操作的优先级变低,可以设置系统变量low_priority_updates
的值为ON
。该变量是全局变量,也是会话变量。可以使用SET
语句设置。
如果表上设置了很多写操作的表锁,某些挂起的SELECT
s操作可能会被执行。因为系统变量max_write_lock_count
控制了允许的写操作表锁的最大数量。该变量是动态变量,可在服务运行过程中随时修改。
如果写语句的优先级更高(默认情况下它的优先级就比读操作优先级高),那么每个写操作的语句(INSERT
、REPLACE
、UPDATE
、DELETE
)都可以通过使用关键字LOW_PRIORITY
设置它们的优先级低于读操作,同理,SELECT
语句可以通过使用关键字HIGH_PRIORITY
设置它的优先级高于写操作。此外,LOCK TABLES
也支持为WRITE
锁设置LOW_PRIORITY
。
如果读操作的优先级更高,可以为INSERT
语句设置HIGH_PRIORITY
使其优先级重新高于读操作。但是,除了INSERT
,其他写操作无法设置HIGH_PRIORITY
来重新提升优先级。
之所以INSERT
可以设置HIGH_PRIORITY
,是因为要通过它来阻止并发插入行为。