<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試命中率 90% 的點 :MySQL 鎖

          共 2977字,需瀏覽 6分鐘

           ·

          2020-12-22 11:25

          點擊上方藍色“程序猿DD”,選擇“設為星標”

          回復“資源”獲取獨家整理的學習資料!

          一、對MySQL的鎖的了解

          當數據庫有并發(fā)事務的時候,可能會產生數據的不一致,這時候需要一些機制來保證訪問的次序,鎖機制就是這樣的一個機制。

          就像酒店的房間,如果大家隨意進出,就會出現多人搶奪同一個房間的情況,而在房間上裝上鎖,申請到鑰匙的人才可以入住并且將房間鎖起來,其他人只有等他使用完畢才可以再次使用。

          二、隔離級別與鎖的關系

          在Read Uncommitted級別下,讀取數據不需要加共享鎖,這樣就不會跟被修改的數據上的排他鎖沖突

          在Read Committed級別下,讀操作需要加共享鎖,但是在語句執(zhí)行完以后釋放共享鎖。

          在Repeatable Read級別下,讀操作需要加共享鎖,但是在事務提交之前并不釋放共享鎖,也就是必須等待事務執(zhí)行完畢以后才釋放共享鎖。

          SERIALIZABLE 是限制性最強的隔離級別,因為該級別鎖定整個范圍的鍵,并一直持有鎖,直到事務完成。

          三、按照鎖的粒度分數據庫鎖有哪些?鎖機制與InnoDB鎖算法

          在關系型數據庫中,可以按照鎖的粒度把數據庫鎖分為行級鎖(INNODB引擎)、表級鎖(MYISAM引擎)和頁級鎖(BDB引擎 )。

          MyISAM和InnoDB存儲引擎使用的鎖:

          MyISAM采用表級鎖(table-level locking)。

          InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖。

          行級鎖,表級鎖和頁級鎖對比

          行級鎖:MySQL中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少數據庫操作的沖突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖和排他鎖。

          特點:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。

          表級鎖:MySQL中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,被大部分MySQL引擎支持。最常使用的MyISAM與InnoDB都支持表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨占寫鎖(排他鎖)。

          特點:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發(fā)出鎖沖突的概率最高,并發(fā)度最低。

          頁級鎖:是MySQL中鎖定粒度介于行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但沖突多,行級沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。

          特點:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般

          四、從鎖的類別上分MySQL都有哪些鎖呢?像上面那樣子進行鎖定豈不是有點阻礙并發(fā)效率了

          從鎖的類別上來講,有共享鎖和排他鎖。

          共享鎖: 又叫做讀鎖。當用戶要進行數據的讀取時,對數據加上共享鎖。共享鎖可以同時加上多個。

          排他鎖: 又叫做寫鎖,當用戶要進行數據的寫入時,對數據加上排他鎖。排他鎖只可以加一個,他和其他的排他鎖,共享鎖都相斥。

          用上面的例子來說就是用戶的行為有兩種,一種是來看房,多個用戶一起看房是可以接受的。一種是真正的入住一晚,在這期間,無論是想入住的還是想看房的都不可以。

          鎖的粒度取決于具體的存儲引擎,InnoDB實現了行級鎖,頁級鎖,表級鎖。

          他們的加鎖開銷從大到小,并發(fā)能力也是從大到小。

          五、MySQL中InnoDB引擎的行鎖是怎么實現的?

          InnoDB是基于索引來完成行鎖

          例: select * from tab_with_index where id = 1 for update;

          for update 可以根據條件來完成行鎖鎖定,并且 ID 是有索引鍵的列,如果 ID不是索引鍵那么InnoDB將完成表鎖,并發(fā)將無從談起

          六、InnoDB存儲引擎的鎖的算法有三種

          1.Record lock:單個行記錄上的鎖

          2.Gap lock:間隙鎖,鎖定一個范圍,不包括記錄本身

          3.Next-key lock:record+gap 鎖定一個范圍,包含記錄本身

          七、相關知識點:

          Innodb對于行的查詢使用next-key lock

          Next-locking keying為了解決Phantom Problem幻讀問題

          當查詢的索引含有唯一屬性時,將next-key lock降級為record key

          Gap鎖設計的目的是為了阻止多個事務將記錄插入到同一范圍內,而這會導致幻讀問題的產生

          有兩種方式顯式關閉gap鎖:(除了外鍵約束和唯一性檢查外,其余情況僅使用record lock)

          A. 將事務隔離級別設置為RC

          B. 將參數innodb_locks_unsafe_for_binlog設置為1

          八、什么是死鎖?怎么解決?

          死鎖是指兩個或多個事務在同一資源上相互占用,并請求鎖定對方的資源,從而導致惡性循環(huán)的現象。

          常見的解決死鎖的方法

          1、如果不同程序會并發(fā)存取多個表,盡量約定以相同的順序訪問表,可以大大降低死鎖機會。

          2、在同一個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖產生概率;

          3、對于非常容易產生死鎖的業(yè)務部分,可以嘗試使用升級鎖定顆粒度,通過表級鎖定來減少死鎖產生的概率;

          如果業(yè)務處理不好可以用分布式事務鎖或者使用樂觀鎖

          九、數據庫的樂觀鎖和悲觀鎖是什么?怎么實現的?

          數據庫管理系統(DBMS)中的并發(fā)控制的任務是確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性。樂觀并發(fā)控制(樂觀鎖)和悲觀并發(fā)控制(悲觀鎖)是并發(fā)控制主要采用的技術手段。

          悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數據完整性的操作。在查詢完數據的時候就把事務鎖起來,直到提交事務。

          實現方式:使用數據庫中的鎖機制

          樂觀鎖:假設不會發(fā)生并發(fā)沖突,只在提交操作時檢查是否違反數據完整性。在修改數據的時候把事務鎖起來,通過Version的方式來進行鎖定。

          實現方式:一般會使用版本號機制或CAS算法實現。

          兩種鎖的使用場景

          從上面對兩種鎖的介紹,我們知道兩種鎖各有優(yōu)缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下(多讀場景),即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。

          但如果是多寫的情況,一般會經常產生沖突,這就會導致上層應用會不斷的進行Retry,這樣反倒是降低了性能,所以一般多寫的場景下用悲觀鎖就比較合適。

          推薦一個專注后端面試的公眾號

          長按掃碼關注,每天學習,一起進大廠!



          【往期推薦】

          左滑右滑,在VS Code里滑個妹紙給你寫喜歡的代碼?

          2020-12-18

          教你一分鐘內導出 Grafana 所有的 Dashboard

          2020-12-18

          注意!我們熟知的“摩爾定律”被廢了...

          2020-12-17

          Spring Boot 2.4 對多環(huán)境配置的支持更改

          2020-12-17

          首支完全由 AI 創(chuàng)作的歌曲《未來之歌》發(fā)布!對于未來,你方了嗎?

          2020-12-16

          深度內容

          推薦加入


          歡迎加入知識星球,一起探討技術架構,交流技術人生。
          加入方式,長按下方二維碼:
          已在知識星球更新如下:

          素質二連,走一個

          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  偷拍真实偷窥XXX盗摄 | 国产一级无码免费视频 | 天天爽天天爽夜夜爽毛片资源 | 久久久久久久久久久久久不卡了 | 欧美日本在线 |