mysql實戰45講 給表加鎖怎麼有這麼多阻礙

2021-09-24 21:18:47 字數 1198 閱讀 3455

總結:

根據加鎖範圍: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事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻回訪,而是等到事務結束時才釋放,這就是兩階段鎖協議。因此,如果事...