前言
为了给高并发情况下的MySQL进行更好的优化,有必要了解一下MySQL查询更新时的锁表机制。
概述
MySQL有三种锁的级别:页级、表级、行级。
-
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
-
BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁;
-
InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
-
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
-
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
-
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
MyISAM表锁
MyISAM存储引擎只支持表锁,是现在用得最多的存储引擎。 但表级锁让多线程可以同时从数据表中读取数据,但是如果另一个线程想要写数据的话,就必须要先取得排他访问。正在更新数据时,必须要等到更新完成了,其他线程才能访