MySQL裏鎖的類型

根據加鎖範圍:MySQL裏面的鎖可以分爲:全局鎖、表級鎖、行級鎖

一、全局鎖:
對整個數據庫實例加鎖。
MySQL提供加全局讀鎖的方法:Flush tables with read lock(FTWRL)
這個命令可以使整個庫處於只讀狀態。使用該命令之後,數據更新語句、數據定義語句和更新類事務的提交語句等操作都會被阻塞。
使用場景:全庫邏輯備份。
風險:
1.如果在主庫備份,在備份期間不能更新,業務停擺
2.如果在從庫備份,備份期間不能執行主庫同步的binlog,導致主從延遲
官方自帶的邏輯備份工具mysqldump,當mysqldump使用參數--single-transaction的時候,會啓動一個事務,確保拿到一致性視圖。而由於MVCC的支持,這個過程中數據是可以正常更新的。

一致性讀是好,但是前提是引擎要支持這個隔離級別。
如果要全庫只讀,爲什麼不使用set global readonly=true的方式?
1.在有些系統中,readonly的值會被用來做其他邏輯,比如判斷主備庫。所以修改global變量的方式影響太大。
2.在異常處理機制上有差異。如果執行FTWRL命令之後由於客戶端發生異常斷開,那麼MySQL會自動釋放這個全局鎖,整個庫回到可以正常更新的狀態。而將整個庫設置爲readonly之後,如果客戶端發生異常,則數據庫就會一直保持readonly狀態,這樣會導致整個庫長時間處於不可寫狀態,風險較高。
二、表級鎖
MySQL裏面表級鎖有兩種,一種是表鎖,一種是元數據所(meta data lock,MDL)
表鎖的語法是:lock tables ... read/write
可以用unlock tables主動釋放鎖,也可以在客戶端斷開的時候自動釋放。lock tables語法除了會限制別的線程的讀寫外,也限定了本線程接下來的操作對象。
對於InnoDB這種支持行鎖的引擎,一般不使用lock tables命令來控制併發,畢竟鎖住整個表的影響面還是太大。
MDL:不需要顯式使用,在訪問一個表的時候會被自動加上。
MDL的作用:保證讀寫的正確性。
在對一個表做增刪改查操作的時候,加MDL讀鎖;當要對錶做結構變更操作的時候,加MDL寫鎖。
讀鎖之間不互斥。讀寫鎖之間,寫鎖之間是互斥的,用來保證變更表結構操作的安全性。
MDL 會直到事務提交纔會釋放,在做表結構變更的時候,一定要小心不要導致鎖住線上查詢和更新。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章