總結:
根據加鎖範圍: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 會直到事務提交才會釋放,在做表結構變更的時候,一定要小心不要導致鎖住線上查詢和更新。
實戰mysql45講 MySQL實戰45講
作者簡介 林曉斌,網名 丁奇 前阿里資深技術專家,曾負責阿里雲rds核心開發團隊和運維團隊,並推動了alisql分支開源。作為活躍的mysql社群貢獻者,丁奇專注於資料儲存系統 mysql原始碼研究和改進 mysql效能優化和功能改進,熱衷於解決mysql疑難問題。課程亮點 你將獲得 前阿里資深技術...
mysql實戰45講 43 使用分割槽表
有些時候,一些公司的規範不允許使用分割槽表,分割槽表有什麼問題?先建立乙個分割槽表 create table t ftime datetime not null,c int 11 default null,key ftime engine innodb default charset latin1 ...
mysql實戰45講筆記 07
07 行鎖功過 怎麼減少行鎖對效能的影響 mysql的行鎖是在引擎層由各個引擎自己實現的,不是所有資料庫都支援行鎖比如myisam 行鎖就是針對資料表中行記錄的鎖。在innodb事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻回訪,而是等到事務結束時才釋放,這就是兩階段鎖協議。因此,如果事...