MySQL資料庫常見面試題:闡述樂觀、悲觀鎖,、表鎖,讀、寫鎖,間隙鎖
(重要,好多公司都考)
解析參考
根據加鎖範圍
全局鎖:是對整個資料庫實例加鎖。常的場景是全庫邏輯備份(也就是把整庫每個表都select出來存成本),對於InnoDB可以可重複讀這隔離級別進備份,但是對於MyISAM只能全局鎖表級鎖。
表鎖: lock tables t1 read, t2 write; 那麼該線程只能讀t1,寫t2,其他線程只能寫t1,讀t2。
元數據鎖:即MDL,MySQL5.5版本引。當對個表做增刪改查操作的時候,加MDL讀鎖;當要對表變更操作的時候,加MDL寫鎖。讀鎖之間不互斥,讀寫鎖之間、寫鎖之間是互斥的。
MySQL所有引擎都持表鎖。
級鎖
由各個引擎實現。
即鎖定某個表中的特定,並發度,鎖粒度低。
在InnoDB事務中,鎖是在需要的時候才加上的,但並不是不需要了就刻釋放,是要等到事務結束時才釋放,這個就是兩階段鎖協議 。
鎖容易產死鎖,此時需要使InnoDB的主動死鎖檢測 。
在InnoDB中,級鎖都是基於索引的,如果條SQL語句不到索引是不會使級鎖的,會
使表級鎖把整張表鎖住。
間隙鎖(GAP)
是個範圍於表鎖,於鎖的鎖,主要是為了防幻讀。
如果查詢條件沒有建索引或者不是唯索。引,則會加上間隙鎖(普通查詢是快照讀,這不考慮)。
加鎖範圍是查詢條件的兩側。
根據鎖的讀寫式
共享鎖稱為讀鎖,簡稱S鎖。共享鎖就是多個事務對於同數據可以共享把鎖,都能訪問到數據,但是只能讀不能修改。
排他鎖稱為寫鎖,簡稱X鎖。排他鎖就是不能與其他鎖並存,如個事務獲取了個數據的排他鎖,其他事務就不能再獲取該的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對數據就讀取和修改
SS鎖不互斥,SX和XX鎖都互斥
根據鎖的特徵
悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別會修改,所以每次在拿數據的時
候都會上鎖,這樣別想拿這個數據就會阻塞直到它拿到鎖。傳統的關係型資料庫邊就到了很多這種鎖機制,如鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨佔鎖就是悲觀鎖思想的實現。
樂觀鎖:總是假設最好的情況,每次去拿數據的時候都認為別不會修改,所以不會上鎖,但是在更新的時候會判斷下在此期間別有沒有去更新這個數據,可以使版本號機制和CAS算法實現。樂觀鎖適於多讀的應類型,這樣可以提吞吐量。使版本號時,可以在數據初始化時指定個版本號,每次對數據的更新操作都對版本號執+1操作。並判斷當前版本號是不是該數據的最新的版本號,如果不是,則重新更新。在JDK中的些包,如java.util.concurrent.atomic 包下的原變量類就是使了樂觀鎖的種實現式CAS實現的。
樂觀鎖在不發取鎖失敗的情況下開銷悲觀鎖,但是旦發失敗回滾開銷則較,因此適合在取鎖失敗概率較的場景,可以提升系統並發性能
樂觀鎖還適於些較特殊的場景,例如在業務操作過程中法和資料庫保持連接等悲觀鎖法適的地。
以上就是小科今天整理提供的MySQL面試題,你記住並理解了嗎?希望以上的內容能夠為學習C++、MySQL的同學提供了有用的面試素材及學習素材,以後小科每日均會提供MySQL、Python及Web相關的習題,趕快學習起來吧。