根據加鎖範圍: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 會直到事務提交纔會釋放,在做表結構變更的時候,一定要小心不要導致鎖住線上查詢和更新。
MySQL裏鎖的類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
6:多源複製的實現
shixiazhoujun
2019-02-24 13:04:18
7:基於語句和行復制的優缺點
shixiazhoujun
2019-02-24 13:04:18
詳解MySQL執行原理、邏輯分層、更改數據庫處理引擎
laozhang
2019-02-24 12:43:05
MySQL中InnoDB和MyISAM的差別
jackieban
2019-02-23 13:57:24
SQL mapper文件的審計
橡皮高
2019-02-23 13:51:10
數據庫管理工具 Navicat使用教程:SQL Server中的磁盤加密
Aote222
2019-02-23 13:34:13
Redhat環境MySQL+Apache+PHP環境配置
znlingdong
2019-02-23 13:29:59
MySQL字符集選擇
兩袖春風
2019-02-23 13:28:22
MySQL數據類型之Pk10平臺架設字符串(string)
wojiuyong
2019-02-23 13:25:22
MySQL 的並集、交集和差集 交集和差集類似oracle中minus的用法
zhengfj
2019-02-23 13:13:04
在同一臺機器上運行多個MySQL服務器
zhengfj
2019-02-23 13:13:04
14.5 InnoDB Locking and Transaction Model
shixiazhoujun
2019-02-23 13:04:53
14.4.11 Undo Tablespace
shixiazhoujun
2019-02-23 13:04:53