瞭解MySQL的全局鎖和表級鎖mysql
全局鎖兩種方式:sql
以上兩種方式不一樣點:
使用mysqldump 前提是 引擎支持隔離級別 ,因此single-transaction方法只適用於支持事務引擎的庫;MyISAM不支持事務,因此只能使用FTWRL命令數據庫
set global readonly = true
複製代碼
這條語句也能夠作到全庫只讀,可是不建議使用:安全
以上哪一種方式,一個庫被全局上鎖後,對立面任何一個表作字段操做,都會被鎖住的多線程
即便沒有全局加鎖,有了表級鎖,加字段也會遇到問題併發
MySQL有兩種表級別的鎖:一種是表鎖、另外一種是元數據鎖(metadata lock,MDL)工具
lock tables xxx read/write
例如 線程A執行了lock table t1 read,t2 write
效果是 包括A線程在內的全部線程對於t1表只可讀,寫被阻塞;t2表讀寫都被阻塞
lock tables操做能夠用unlock tables主動釋放,也能夠在客戶端斷開的時候自動釋放。post
該操做不只阻塞其餘線程的操做,也阻塞了當前線程的操做學習
對於innoDB這種支持行鎖的引擎,通常不使用lock tables
命令控制併發,影響過大spa
MDL(metadata lock)
MDL在訪問一個表的時候會自動加上,MDL的做用是,保證讀寫的正確性。當表作增刪改查操做時,加MDL讀鎖;當對錶結構變動的時候,加MDL寫鎖。
DDL NOWAIT/WAIT n
這個語法alter table tb1_name NOWAIT add column...
alter table tb1_name WAIT N add column...
複製代碼
對於使用innoDB引擎的庫,建議使用–single-transaction 參數,對應用會更友好。
本文爲極客時間《MySQL實戰45講》 的學習筆記,其中含有部分原文,若有侵權行爲請聯繫我馬上刪除
第一節:一條SQL查詢語句的執行過程