MySQL的全局鎖是用來保證MySQL實例的數據一致性的鎖。它對整個MySQL實例生效,不同于其他鎖競爭范圍是表或行,MySQL全局鎖同時鎖住了所有的數據庫,這意味著只有一個用戶可以執行修改表和表結構的命令。
一個MySQL實例只有一個全局鎖,當一個線程獲取到該鎖時,其他線程只能等待該鎖被釋放才能執行下一步操作。全局鎖一般是由MySQL后臺線程自動獲取,但是有些情況下需要手動獲取。
一個全局鎖的例子如下:
FLUSH TABLES WITH READ LOCK;
執行該命令會使得MySQL實例上所有的表變為只讀狀態,此時可以備份MySQL實例的所有表文件。如果需要進行寫操作,則可以先使用UNLOCK TABLES語句解鎖所有表。
值得注意的是,全局鎖的獲取是有代價的,因為獲取鎖需要等待其他線程的操作完成,這樣就會導致整個MySQL實例暫停,所以應當盡可能地減少全局鎖的使用。