表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操做的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。安全
特色:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的几率最高,并发度最低。并发
MySQL 中表级锁有两种:一种是表锁,另外一种是元数据锁(meta data lock, MDL)。code
表锁的语法是 lock tables...read/write。与 FTWRL 相似,可使用 unlock tables 主动释放锁,或者在客户端断开连接时自动释放。blog
在尚未出现更细粒度的锁以前,表锁是最经常使用于处理并发的。而对 InnoDB 这种支持行锁的引擎,通常不使用 lock tables 命令来控制并发。资源
另外一类表级的锁是MDL。MDL不须要显式使用,在访问一个表的时候会被自动加上。get
在MySQL 5.5版本中引入MDL,当对一个表作 CURD 时,加 MDL 读锁;当要对表作 DDL 时,加 MDL 写锁;it
有时候给一个小表加个字段,可能会致使整个库挂掉。假设表 t 是一个小表。table
会话A加了 MDL 读锁;会话B也加了 MDL 读锁,能够正常执行;会话C被阻塞,等待会议A释放 MDL 读锁。meta
若是只是会话C被阻塞倒不要紧,但以后全部在表 t 上新申请MDL 读锁都会被会议C阻塞。也就是这个表如今彻底不能读写了。语法
很简单,在 ALTER TABLE
加等待时间。若是超过等待时间后,操做回滚。
MariaDB 已经合并了 AliSQL 的这个功能,因此这两个开源分支目前都支持 DDL NOWAIT/WAIT n 这个语法。
ALTER TABLE tbl_name NOWAIT add column ... ALTER TABLE tbl_name WAIT N add column ...