對整個庫例項加鎖。
讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞:
增刪改、建表、修改表結 更新類事務的提交
mysql 提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock
(ftwrl)。用unlock tables
主動釋放鎖,也可以在客戶端斷開的時候自動釋放。
使用場景是,做全庫邏輯備份, 把整庫每個表都 select 出來存成文字。
主庫上備份,業務基本上就得停擺;
從庫上備份,不能執行主庫同步過來的 binlog,會導致主從延遲
所以盡量不用, 而是利用事務的檢視, 除非 是myisam 這種不支援事務的引擎, 只要庫裡面有表不支援事務, 就不能用了
可重複讀 : 資料庫裡在事務啟動時建立乙個檢視,整個事務存在期間都用這個檢視。官方自帶的邏輯備份工具是 mysqldump。
mysqldump 使用引數–single-transaction ,導資料之前就會啟動乙個事務,來確保拿到一致性檢視。這個過程中資料是可以正常更新的 (mvcc )
為什麼不使用 set global readonly=true 的?表語法是 lock tables … read/write。可以用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。readonly 方式也可以讓全庫進入唯讀狀態,但:
1.在有些系統中,readonly 的值會被用來做其他邏輯,比如用來判斷乙個庫是主庫還是備庫。因此,修改 global 變數的方式影響面更大
2.在異常處理機制上有差異。如果執行 ftwrl 命令之後由於客戶端發生異常斷開,那麼 mysql 會自動釋放這個全域性鎖,整個庫回到可以正常更新的狀態。而將整個庫設定為 readonly 之後,如果客戶端發生異常,則資料庫就會一直保持 readonly 狀態,這樣會導致整個庫長時間處於不可寫狀態,風險較高。
在還沒有出現更細粒度的鎖的時候,表鎖是最常用的處理併發的方式。innodb 支援行鎖,就不用了
innodb 在非索引上查詢的鎖 ,如果非要加鎖的話 是表級鎖 ....其實預設多版本併發 不加鎖
mdl 不需要顯式使用,系統缺省會加的,在訪問乙個表的時候會被自動加上。
作用是,保證讀寫的正確性。
對乙個表做增刪改查操作的時候,加mdl 讀鎖(讀鎖之間不互斥,可同時對一張表增刪改查)
對錶做結構變更操作的時候,加mdl 寫鎖。
讀寫鎖、寫鎖 之間是互斥的,來保證變更 表結構 操作的安全性。
坑:
session c alter改表結構, 得了寫鎖, 又要改表中資料, 要等讀鎖, 而事務沒結束, 寫鎖不會放開,阻塞住了, 下面都不能進行了,如果某查詢語句頻繁,客戶端有重試機制,超時後會再起乙個新 session 再請求的話,這個庫的執行緒很快就會爆滿。
所以,最好是 在 alter table 語句裡面設定等待時間,如果在這個指定的等待時間裡面能夠拿到 mdl 寫鎖最好,拿不到也不要阻塞後面的業務語句,先放棄。之後開發人員或者 dba 再通過重試命令重複這個過程。
mariadb 支援 ddl nowait/wait n 這個語法。
alter table tbl_name nowait add column ...
alter table tbl_name wait n add column ...
mysql 4 1 全域性鎖 表鎖 行級鎖
描述 兩階段鎖協議 行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放,而是要等到事務結束時才釋放 行鎖針對資料表中行記錄的鎖 死鎖當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態 根據加鎖的範圍,mysql 裡面的鎖大致...
《MySQL必懂系列》全域性鎖 表級鎖 行鎖
mysql提供了不同等級的鎖,按限制能力的劃分,分為全域性鎖 表鎖 行鎖。本文會描述不同鎖的應用場景與實現原理。全域性鎖就是對整個mysql資料庫加鎖,mysql中的命令是 flush tables with read lock ftwrl 在執行這個命令之後,mysql進入全域性鎖的狀態,整個資料...
MySQL中的全域性鎖和表級鎖
資料庫鎖設計的初衷是解決併發出現的一些問題。當出現併發訪問的時候,資料庫需要合理的控制資源的訪問規則。而鎖就是訪問規則的重要資料結構。根據鎖的範圍,分為全域性鎖 表級鎖和行級鎖三類。全域性鎖就是對整個資料庫例項加鎖。mysql提供而乙個全域性讀鎖的方法。命令是 flush tables with r...