全局級別鎖
全局鎖
MySQL的全局鎖是經過FTWRL的方式加上的,完整語句爲:Flush tables with read lock .數據庫
FTWRL操做會爲數據庫加全局讀鎖(FTWRL不是隻有這一步操做),以後其餘線程的如下語句會被阻塞:數據更新語句(數據的增刪改)、數據定義語句(包spa
括建表、修改表結構等)和更新類事務的提交語句 。線程
表級別鎖
表鎖
MySQL的表鎖加鎖方式爲:lock tables …read/write,從語句的語義上能夠了解到,能夠分別爲表加讀鎖和寫鎖,解鎖的方式爲: unlock table。索引
注意:當你在A線程加了表鎖以後,例如:lock tables t1 read, t2 write(爲t1加讀鎖,t2加寫鎖),那麼A線程能夠操做的表只有t一、t2,且能夠進行的操做事務
爲:對t1讀,對t2讀寫;總結一下:加鎖的線程只能夠操做加鎖的表,且進行的操做要按照讀寫鎖的規則來。it
MDL鎖 (metadata lock鎖)
在MySQL 5.5版本中引入了MDL,當對一個表作增刪改查操做的時候,加MDL讀鎖;當 要對錶作結構變動操做的時候,加MDL寫鎖 ,MDL鎖是自動加的。table
行級別鎖
MySQL的行鎖是在引擎層由各個引擎本身實現的。MyISAM引擎不支持行鎖,InnoDB引擎支持行鎖,如下行鎖均由InnoDB實現。行級鎖是經過鎖索引來實現的,不然退化爲表級鎖。class
排他鎖
UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖(X),也能夠用for update顯示加鎖;排他鎖與寫鎖規則一致。date
共享鎖
可用lock in share mode顯示加鎖,共享鎖與讀鎖規則一致。meta
間隙鎖
間隙鎖是爲了在可重複讀級別下防止幻讀,針對索引上的鎖,鎖的是查詢的行的先後間隙,與寫鎖規則一致。
NEXT-KEY鎖
間隙鎖 && ( 共享鎖 || 排他鎖 ) = NEXT-KEY鎖