MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
<1> 表锁
表锁的语法是 lock tables … read/write。与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候
自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。
【加锁方式】
如果在某个线程 A 中执行 lock tables t read, t1 write;
则其他线程写 t、读写 t1 的语句都会被阻塞。
同时,线程 A 在执行 unlock tables 之前,也只能执行读 t、读写 t1 的操作。连写 t 都不允许,自然也不能访问其他表。
<2> MDL 锁
另一类表级的锁是 MDL(metadata lock)。MDL 不需要显式使用,在访问一个表的时候会被自动加上。MDL 的作用是,保证读写
的正确性。假如一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结
果跟表结构对不上,所以必须要加 MDL 锁来保证读写的正确性。
【加锁方式】
对一个表做增删改查时,加 MDL 读锁;对表做结构变更操作时,加 MDL 写锁。
读锁之间不互斥,可以多个线程同时对数据进行增删改查;
读锁与写锁,写锁与写锁之间是互斥的,也就是说当数据结构变更时,是无法执行增删改查或者其他数据结构变更的。
2.3 行级锁
MySQL 的行锁是在引擎层实现的,只有支持事务的引擎才有行锁,最常见的就是 InnoDB 引擎。比如 MyISAM 引擎不支持事务,所
以就没有行锁,所以它要实现并发控制的时候只能使用表锁。
文档被以下合辑收录
评论