Mysql俩种表级锁
MySQL 里面表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(meta data lock,MDL)。
表鎖的語法是 lock tables … read/write。與 FTWRL 類似,可以用 unlock tables 主動釋放 鎖,也可以在客戶端斷開的時候自動釋放。需要注意,lock tables 語法除了會限制別的線程的 讀寫外,也限定了本線程接下來的操作對象。 舉個例子, 如果在某個線程 A 中執行 lock tables t1 read, t2 write; 這個語句,則其他線程寫 t1、讀寫 t2 的語句都會被阻塞。同時,線程 A 在執行 unlock tables 之前,也只能執行讀 t1、 寫 t2 的操作。連讀 t2 都不允許,自然也不能訪問其他表。 在還沒有出現更細粒度的鎖的時候,表鎖是最常用的處理并發的方式。而對于 InnoDB 這種支 持行鎖的引擎,一般不使用 lock tables 命令來控制并發,畢竟鎖住整個表的影響面還是太大。
另一類表級的鎖是 MDL(metadata lock)。MDL 不需要顯式使用,在訪問一個表的時候會被 自動加上。MDL 的作用是,保證讀寫的正確性。你可以想象一下,如果一個查詢正在遍歷一個 表中的數據,而執行期間另一個線程對這個表結構做變更,刪了一列,那么查詢線程拿到的結果 跟表結構對不上,肯定是不行的。
?
注:MySQL 提供了一個加全局讀鎖的方法,命令是 Flush tables with read lock (FTWRL)。當你需要讓整個庫處于只讀狀態的時候,可以使用這個 命令,之后其他線程的以下語句會被阻塞:數據更新語句(數據的增刪改)、數據定義語句(包 括建表、修改表結構等)和更新類事務的提交語句。
總結
以上是生活随笔為你收集整理的Mysql俩种表级锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python绘制三维散点图
- 下一篇: MySQL为什么有时候会选错索引?