本人曾經參加過一次面試,被問到了select會不會加鎖,當時我斬釘截鐵的說,不加鎖,因為有mvcc,當時我是覺得自己無比的正確
不過今天剛好看到不錯的文章,我知道了select會加鎖,而且加的還是表級鎖。
表級鎖?別擔心,表級鎖並不是表鎖,而是meta lock元數據鎖,元數據鎖分為讀鎖和寫鎖,所有的dml都是讀鎖,而ddl才是寫鎖。
知道了這個有什么好處嗎?當然有了
MDL鎖是系統默認會加的,但卻是你不能忽略的一個機制。比如下面這個例子,我經常看到有人掉到這個坑里:給一個小表加個字段,導致整個庫掛了。

我們可以看到session A先啟動,這時候會對表t加一個MDL讀鎖。由於session B需要的也是MDL讀鎖,因此可以正常執行。
之后session C會被blocked,是因為session A的MDL讀鎖還沒有釋放,而session C需要MDL寫鎖,因此只能被阻塞。
如果只有session C自己被阻塞還沒什么關系,但是之后所有要在表t上新申請MDL讀鎖的請求也會被session C阻塞。前面我們說了,所有對表的增刪改查操作都需要先申請MDL讀鎖,就都被鎖住,等於這個表現在完全不可讀寫了。
如果某個表上的查詢語句頻繁,而且客戶端有重試機制,也就是說超時后會再起一個新session再請求的話,這個庫的線程很快就會爆滿。
你現在應該知道了,事務中的MDL鎖,在語句執行開始時申請,但是語句結束后並不會馬上釋放,而會等到整個事務提交后再釋放。
現在你知道該如何安全的給表改結構了嗎?那就是一定要等到很少有人在用的時候,高並發環境下真的會把mysql搞的down掉
