主頁 > 軟體設計 > 面試讓HR都能聽懂的MySQL鎖機制,歡聲笑語中搞懂MySQL鎖

面試讓HR都能聽懂的MySQL鎖機制,歡聲笑語中搞懂MySQL鎖

2021-04-21 11:59:31 軟體設計

小伙伴想精準查找自己想看的MySQL文章?喏 → MySQL江湖路 | 專欄目錄

??騰訊云資料庫負責人林曉斌說過:“我們面試MySQL同事時只考察兩點,索引和鎖”,言簡意賅,MySQL鎖的重要性不言而喻,
??本文通過同事“僑總”的一場面試,帶你通俗易懂的掌握MySQL各種鎖機制,希望可以幫到你!近期會繼續整理深入性的鎖機制文章,有興趣的老鐵,記得關注一下,到時叫你????~

??今天的主人公是我們公司同事僑總,傳說中手上有10個位元幣的男人,自從位元幣大漲以來,養成了幾個小愛好:周末聽戲坐包廂,騎馬酒吧滑雪場,

在這里插入圖片描述

??這不,前兩天僑總又雙叒叕出來體驗面試了,晚上請我燒烤時跟我聊了聊這次有趣的面試經歷,真是意猶未盡,趁他回味之余我又吃了十幾串兒腰子和羊肉~ 嗯,真香!

??對不住,跑題了,,人到中年嘛,保溫杯里泡枸杞之余總會,,,

??來不及解釋了,快上車!

大家好,我是陳哈哈的同事“僑總”,領導一般不敢喊我名字,都叫我小僑~

下面是我的一次面試經歷,面試官是技術經理和HR,大家吃好喝好~

在這里插入圖片描述

僑總:馬…小馬哥好!

面試官:你好,小僑啊,看你簡歷寫著精通MySQL鎖,你認為精通應該是啥水平呢?

僑總:馬哥我是個老實人,我認為精通就是,比面試官知道的多就完了,,

面試官:(??怎么有種似曾相識的感覺?《聽我講完redo log、binlog原理,面試官老臉一紅》)

面試官:行,那你先給我說說MySQL設計這個鎖是干啥用的呀?

僑總:資料庫鎖設計的初衷是處理并發問題,作為多用戶共享的資源,當出現并發訪問的時候,為了保證資料的一致性,資料庫需要合理地控制資源的訪問規則,而鎖就是用來實作這些訪問規則的重要機制,

??簡單說,資料表就像公共廁所,emmm…換個下飯的說法,資料表就好比您開的一家酒店,而每行資料就像酒店的房間,如果大家隨意進出,就會出現多人搶奪同一個房間的情況,而在房間上裝上鎖,申請到鑰匙的人才可以入住并且將房間鎖起來,其他人只有等他用完退房后才可以再次使用,這樣保證了房間的一致性,方便酒店進行管理,

??MySQL鎖機制的初衷便是如此,當然,MySQL資料庫由于其自身架構的特點,存在多種資料存盤引擎,每種存盤引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種存盤引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各存盤引擎的鎖定機制也有較大區別,

面試官:嗯,那你說一下MySQL都分為哪些鎖,

在這里插入圖片描述

僑總

  1. 按鎖粒度從大到小分類:表鎖頁鎖行鎖;以及特殊場景下使用的全域鎖

  2. 如果按鎖級別分類則有:共享(讀)鎖排他(寫)鎖意向共享(讀)鎖意向排他(寫)鎖

  3. 以及Innodb引擎為解決幻讀等并發場景下事務存在的資料問題,引入的Record Lock(行記錄鎖)Gap Lock(間隙鎖)Next-key Lock(Record Lock + Gap Lock結合)等;

  4. 還有就是我們面向編程的兩種鎖思想:悲觀鎖、樂觀鎖,

面試官:袁芳你怎么看?

HR小姐姐:,,,

面試官:小僑啊,那你來談一談你對表鎖、行鎖的理解吧,

表鎖

僑總:表級別的鎖定是MySQL各存盤引擎中最大顆粒度的鎖定機制,該鎖定機制最大的特點是實作邏輯非常簡單,帶來的系統負面影響最小,所以獲取鎖和釋放鎖的速度很快,由于表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題,

??當然,鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源爭用的概率也會最高,大大降低并發度,

??使用表級鎖定的主要是MyISAM,MEMORY,CSV等一些非事務性存盤引擎,

行鎖

僑總:與表鎖正相反,行鎖最大的特點就是鎖定物件的顆粒度很小,也是目前各大資料庫管理軟體所實作的鎖定顆粒度最小的,由于鎖定顆粒度很小,所以發生鎖定資源爭用的概率也最小,能夠給予應用程式盡可能大的并發處理能力從而提高系統的整體性能,

??雖然能夠在并發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端,由于鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了,此外,行級鎖定也最容易發生死鎖

??使用行級鎖定的主要是InnoDB存盤引擎,

  • 適用場景:從鎖的角度來說,表級鎖更適合于以查詢為主,只有少量按索引條件更新資料的應用,如Web應用;而行級鎖則更適合于有大量按索引條件并發更新資料的情況,同時又有并發查詢的應用場景,

頁鎖

??除了表鎖、行鎖外,MySQL還有一種相對偏中性的頁級鎖,頁鎖是MySQL中比較獨特的一種鎖定級別,在其他資料庫管理軟體中也并不是太常見,頁級鎖定的特點是鎖定顆粒度介于行級鎖定與表級鎖之間,所以獲取鎖定所需要的資源開銷,以及所能提供的并發處理能力也同樣是介于上面二者之間,另外,頁級鎖定和行級鎖定一樣,會發生死鎖,

??使用頁級鎖定的主要是BerkeleyDB存盤引擎,

面試官:那全域鎖是什么時候用的呢?

全域鎖

僑總:首先全域鎖,是對整個資料庫實體加鎖,使用場景一般在全庫邏輯備份時,

??MySQL提供加全域讀鎖的命令:Flush tables with read lock (FTWRL)

??這個命令可以使整個庫處于只讀狀態,使用該命令之后,資料更新陳述句、資料定義陳述句和更新類事務的提交陳述句等修改資料庫的操作都會被阻塞,

風險:

  1. 如果在主庫備份,在備份期間不能更新,業務停擺
  2. 如果在從庫備份,備份期間不能執行主庫同步的binlog,導致主從延遲同步

??還有一種鎖全域的方式:set global readonly=true ,相當于將整個庫設定成只讀狀態,但這種修改global配置量級較重,和全域鎖不同的是:如果執行Flush tables with read lock 命令后,如果客戶端發生例外斷開,那么MySQL會自動釋放這個全域鎖,整個庫回到可以正常更新的狀態,但將庫設定為readonly后,客戶端發生例外斷開,資料庫依舊會保持readonly狀態,會導致整個庫長時間處于不可寫狀態,試想一下微信只能看,不能打字~~

HR小姐姐:那微信不就完蛋了?

僑總:是啊,抓緊找老實人背鍋!

面試官:不錯,你把這幾種鎖的側重點都表述清楚了,那你再說一下你對不同級別的那幾種鎖的使用場景和理解吧?

僑總:MySQL基于鎖級別又分為:共享(讀)鎖排他(寫)鎖意向共享(讀)鎖意向排他(寫)鎖

共享(讀)鎖、排他(寫)鎖、意向共享(讀)鎖、意向排他(寫)鎖

僑總:對于共享(讀)鎖排他(寫)鎖,比如咱們住酒店,入住前顧客都是有權看房的,只看不住想白嫖都是可以的,前臺小姐姐會把門給你打開,當然,也允許不同的顧客一起看(共享 讀),比如和這位殺馬特小伙子,

在這里插入圖片描述

??看房時房間相當于公共場所,小姐姐囑咐不能亂涂亂畫,也不能偷喝免費的礦泉水,,如果你覺得不錯,偷偷跑到前臺要定這間房,交錢后會給你這個房間的鑰匙并將房間狀態改為已入住,不再允許其他人看房(排他 寫),

??對了,當辦理入住時前臺小姐姐也會通知看房的殺馬特小伙子說這間房已經有人定了!!等看房的殺馬特小伙兒罵罵咧咧出門后,看到滿頭大汗的你,鄙夷著咽了一口口水,咳tui!然后你鎖上門哼著歌兒,開始干那些見不得人的事兒~~直到你退房前,其他人無法在看你的房

??可見,讀鎖是可以并發獲取的(共享的),而寫鎖只能給一個事務處理(排他的),當你想獲取寫鎖時,需要等待之前的讀鎖都釋放后方可加寫鎖;而當你想獲取讀鎖時,只要資料沒有被寫鎖鎖住,你都可以獲取到讀鎖,然后去看房,

??另外還有意向讀\寫鎖,嚴格來說他們并不是一種鎖,而是存放表中所有行鎖的資訊,就像我們在酒店,當我們預定一個房間時,就對該行(房間)添加 意向寫鎖,但是同時會在酒店的前臺對該行(房間)做一個資訊登記(旅客姓名、男女、住多長時間、家里幾頭牛等),大家可以把意向鎖當成這個酒店前臺,它并不是真正意義上的鎖(鑰匙),它維護表中每行的加鎖資訊,是共用的,后續的旅客通過酒店前臺來看哪個房間是可選的,那么,如果沒有意圖鎖,會出現什么情況呢?假設我要住房間,那么我每次都要到每一個房間看看這個房間有沒有住人,顯然這樣做的效率是很低下的,殺馬特小伙兒表示支持!

??讀寫鎖、意向鎖的兼容性如下所示;

鎖型別讀鎖寫鎖意向讀鎖意向寫鎖
讀鎖兼容沖突兼容沖突
寫鎖沖突沖突沖突沖突
意向讀鎖兼容沖突兼容兼容
意向寫鎖沖突沖突兼容兼容

僑總:再回到MySQL原理上講

1 共享(讀)鎖(Share Lock)

??共享鎖,又叫讀鎖,是讀取操作(SELECT)時創建的鎖,其他用戶可以并發讀取資料,但在讀鎖未釋放前,也就是查詢事務結束前,任何事務都不能對資料進行修改(獲取資料上的寫鎖),直到已釋放所有讀鎖,

??如果事務A資料B(1024房)加上讀鎖后,則其他事務只能對資料B上加讀鎖,不能加寫鎖,獲得讀鎖的事務只能讀資料,不能修改資料,

SQL顯示加鎖寫法:

SELECTLOCK IN SHARE MODE;

??在查詢陳述句后面增加LOCK IN SHARE MODE,MySQL就會對查詢結果中的每行都加讀鎖,當沒有其他執行緒對查詢結果集中的任何一行使用寫鎖時,可以成功申請讀鎖,否則會被阻塞,其他執行緒也可以讀取使用了讀鎖的表,而且這些執行緒讀取的是同一個版本的資料,

2 排他(寫)鎖(Exclusive Lock)

??排他鎖又稱寫鎖、獨占鎖,如果事務A資料B加上寫鎖后,則其他事務不能再對資料B加任何型別的鎖,獲得寫鎖的事務既能讀資料,又能修改資料

SQL顯示加鎖寫法:

SELECTFOR UPDATE;

??在查詢陳述句后面增加FOR UPDATE,MySQL 就會對查詢結果中的每行都加寫鎖,當沒有其他執行緒對查詢結果集中的任何一行使用寫鎖時,可以成功申請寫鎖,否則會被阻塞,另外成功申請寫鎖后,也要先等待該事務前的讀鎖釋放才能操作,

3 意向鎖(Intention Lock)

??意向鎖屬于表級鎖,其設計目的主要是為了在一個事務中揭示下一行將要被請求鎖的型別,InnoDB 中的兩個表鎖:

  • 意向共享鎖(IS):表示事務準備給資料行加入共享鎖,也就是說一個資料行加共享鎖前必須先取得該表的IS鎖;

  • 意向排他鎖(IX):類似上面,表示事務準備給資料行加入排他鎖,說明事務在一個資料行加排他鎖前必須先取得該表的IX鎖,

??意向鎖是 InnoDB 自動加的,不需要用戶干預,

??再強調一下,對于INSERT、UPDATE和DELETE,InnoDB 會自動給涉及的資料加排他鎖;對于一般的SELECT陳述句,InnoDB 不會加任何鎖,事務可以通過以下陳述句顯式加共享鎖或排他鎖,

共享鎖:SELECT … LOCK IN SHARE MODE;
排他鎖:SELECT … FOR UPDATE;

面試官:(這小子有兩下子)嗯,袁芳你怎么看?

HR:通俗易懂,我聽懂了~~

面試官:好,那最后一個問題,你上面提到了樂觀鎖和悲觀鎖,談談你對它的看法吧,

僑總:其實悲觀鎖和樂觀鎖,也并不是 MySQL 或者資料庫中獨有的概念,而是并發編程的基本概念,主要區別在于,操作共享資料時,“悲觀鎖”即認為資料出現沖突的可能性更大,而“樂觀鎖”則是認為大部分情況不會出現沖突,進而決定是否采取排他性措施,

??反映到 MySQL 資料庫應用開發中,悲觀鎖一般就是利用類似 SELECT … FOR UPDATE 這樣的陳述句,對資料加鎖,避免其他事務意外修改資料,樂觀鎖則與 Java 并發包中的 AtomicFieldUpdater 類似,也是利用 CAS 機制,并不會對資料加鎖,而是通過對比資料的時間戳或者版本號,來實作樂觀鎖需要的版本判斷

??MySQL的多版本并發控制 (MVCC),其本質就可以看作是種樂觀鎖機制,而排他性的讀寫鎖、兩階段鎖等則是悲觀鎖的實作,

面試官:好,小僑我看你對MySQL鎖這塊兒確實研究得比較透徹,連HR都聽懂了,還是讓我比較滿意的,

面試官:你平時有什么愛好么?

僑總:我除了周末聽戲坐包廂,騎馬酒吧滑雪場,就是喜歡炒位元幣啦!

面試官:哦,不好意思,我們公司反對炒位元幣的行為,回去等通知吧,

僑總:???
在這里插入圖片描述

??說著面試官馬經理走出了會議室,HR小姐姐表示我哪壺不開提哪壺,馬老板高點買的位元幣,現在泡沫炸了,虧成馬,老板都差點虧沒了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/278517.html

標籤:其他

上一篇:C語言簡單實作單鏈表(大話資料結構)

下一篇:圖書館操作管理系統

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more