五. 全局鎖和表鎖

全局鎖

  • 全局鎖就是對整個數據庫加鎖,MySQL提供的有一種加鎖的方法,命令是 Flush tables with read lock (FTWRL),加鎖後,DML,DDL操作都將被阻塞
  • 全局鎖的使用場景?
    • 若是在進行數據庫備份的時候沒有加全局鎖,會導致備份系統備份得到的庫不是一個邏輯時間點,這個視圖就是邏輯不一致的
  • InnoDB更好的全局加鎖的方式是怎樣的?
    • 由於InnoDB支持可重複讀,因此可以使用mysql的邏輯備份工具,加上參數 -single-transaction,達到導數據之前就先開啓一個事務,來確保拿到的是一致性的視圖。

表級鎖

  • 表級鎖的分類? 表鎖分爲兩種,一種是表鎖,一種是元數據鎖(meta data lock , MDL)
  • 表鎖的語法是 lock tables … read/write。與 FTWRL 類似,可以用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。需要注意,lock tables 語法除了會限制別的線程的讀寫外,也限定了本線程接下來的操作對象。
  • 另一類表級的鎖是 MDL(metadata lock)。MDL 不需要顯式使用,在訪問一個表的時候會被自動加上。MDL 的作用是,保證讀寫的正確性。
  • MDL鎖是如何自動添加的?
    • 當對一個表做增刪改查操作(DML)的時候,自動加上元數據讀鎖
    • 當對一個表結構進行更改的時候,自動加上元數據寫鎖
  • MDL讀寫鎖之間的關係?
    • 讀鎖之間不互斥,因此你可以有多個線程同時對一張表增刪改查。
    • 讀寫鎖之間、寫鎖之間是互斥的,用來保證變更表結構操作的安全性。因此,如果有兩個線程要同時給一個表加字段,其中一個要等另一個執行完才能開始執行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章