1. 程式人生 > 其它 >MySQL 面試題:鎖

MySQL 面試題:鎖

什麼是全域性鎖?全域性鎖的使用場景?MySQL 如何避免加鎖?

  • 全域性鎖就是對整個資料庫例項加鎖。MySQL 提供了一個加全域性讀鎖的方法,命令是 Flush tables with read lock (FTWRL)。當你需要讓整個庫處於只讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞:資料更新語句(資料的增刪改)、資料定義語句(包括建表、修改表結構等)和更新類事務的提交語句。

  • 全域性鎖的典型使用場景是,做全庫邏輯備份。也就是把整庫每個表都 select 出來存成文字。

  • 當 mysqldump 使用引數 –single-transaction 的時候,導資料之前就會啟動一個事務,來確保拿到一致性檢視。而由於 MVCC 的支援,這個過程中資料是可以正常更新的。

表級鎖的種類?

  • 表級鎖有兩種,一種是針對於表記錄資料的鎖,另外一種就是MDL(metadata lock)的鎖,它是基於表元資料(表結構)的鎖,MDL鎖是為了保證併發環境下讀寫的正確性。

什麼時候加 MDL 鎖?

  • MDL讀鎖:在我們對錶資料進行增刪改查的的時候都需要對錶加MDL讀鎖。

  • MDL寫鎖:當我們對錶結構進行修改的時候會加MDL寫鎖。

  • 讀鎖與寫鎖互斥,寫鎖與寫鎖互斥,讀鎖與讀鎖不影響。

  • 事務中的 MDL 鎖,在語句執行開始時申請,但是語句結束後並不會馬上釋放,而會等到整個事務提交後再釋放。

什麼是行鎖?

  • 顧名思義,行鎖就是針對資料表中行記錄的鎖。這很好理解,比如事務 A 更新了一行,而這時候事務 B 也要更新同一行,則必須等事務 A 的操作完成後才能進行更新。

如果沒有行鎖,只有表鎖會產生什麼影響?

  • 表鎖同一張表在同一時刻只能有一個更新。

怎麼減少行鎖對效能的影響?

  • 在 InnoDB 事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放,而是要等到事務結束時才釋放.如果你的事務中需要鎖多個行,要把最可能造成鎖衝突、最可能影響併發度的鎖儘量往後放.
  • 處理死鎖:1.超時機制,執行緒超時退出。2.死鎖檢測,出現死鎖,回滾死鎖鏈條中的任意事務。