表級鎖是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 ...