被面試官吊打系列 - 事務隔離級別

2021年09月19日17:38:02 科技 1474

來源於公眾號JAVA日知錄 ,

作者飄渺Jam


小張興沖衝去面試,結果被面試官吊打!

小張:面試官,你好。我是來參加面試的。

面試官:你好,小張。我看了你的簡歷,精通MySQL資料庫。那你肯定知道事務吧,你能說說 事務有哪些特性 嗎?

小張:一個事務有4個特性,即ACID

  • 原子性(Atomicity): 事務開始後的所有操作,要麼全部成功要麼全部失敗。
  • 一致性(Consistency): 事務開始前後資料庫的完整性約束沒有被破壞,比如:A向B轉錢,不可能出現A扣了錢,B沒收到錢。
  • 隔離性(Isolation):多個事務並發訪問時,事務之間是隔離的。
  • 持久性(Durability):事務完成後,事務對資料庫的操作被保存在了資料庫,不能回滾。

面試官:嗯,答的很對。那你說說事務有哪幾種隔離級別呢?

小張:事務隔離級別從高到低有四種隔離級別,分別是:串列化(SERIALIZABLE) 、可重複讀(REPEATABLE READ)、讀提交(READ COMMITTED)、讀未提交(READ UNCOMMITTED)。

面試官:嗯嗯,那你能說說這四種隔離級別分別會造成什麼問題嗎?

(小張竊喜,我就知道你要這麼問,還好我平時關注了 『 JAVA日知錄 』 的公眾號)

小張:好的,面試官。

如果資料庫採用 讀未提交(READ UNCOMMITTED)這種隔離級別,會造成 臟讀。事務還沒提交別人就能看到,這樣就不能保證你讀取到的數據是最終的數據,萬一別人把事務回滾了,那就出現了臟數據問題。

讀提交(READ COMMITTED)是指一個事務只能讀取到其他事務已經提交了的數據,這樣就不會出現臟讀的問題,但是它會帶來」不可重複讀 的問題。比如 A事務 將一個人的姓名從張三改成李四,B事務在A事務提交之前讀取到的是張三,但是在A事務提交之後就變成了李四。

可重複讀(REPEATABLE READ):可重複讀是為了解決READ COMMITTED帶來的不可重複讀問題,指的是事務不會讀取到其他事務對已有數據的修改,即使數據已經提交了。也就是說事務開始讀取到的是什麼,在事務提交之前的任意時刻,這些數據都一樣。雖然解決了不可重複讀問題,但是他又會帶來 幻讀 的問題。比如A事務將張三修改成李四,B事務再插入一個名叫李四的用戶,此時事務A再查找名叫李四的用戶會發現多了一條,出現了2個李四,這就是幻讀。

串列化(SERIALIZABLE):解決了上面出現的所有問題,但是它效率最差,它將事務的執行變成順序執行了。

面試官:回答的不錯,那你知道 MySQL的默認隔離級別是什麼嗎

小張:Mysql默認的隔離級別是REPEATABLE READOracle則採用的是READ COMMITTED

面試官:但是我們使用MySQL的時候並沒有出現幻讀啊,怎麼解決的?

小張擦了擦汗,開始有點緊張了:額,InnoDB主要是利用鎖來解決幻讀問題的。

面試官:對,是採用了鎖,那麼具體怎麼實現的呢?

被面試官吊打系列 - 事務隔離級別 - 天天要聞

小張:我...我突然有點事,我先回去了。

面試官:要了解InnoDB怎麼解決幻讀得先知道InnoDB有哪幾種鎖。

  • Record Lock:單個行記錄上的鎖
  • Gap Lock:間隙鎖,鎖定一個範圍,而非記錄本身,遵循左開右閉原則
  • Next-Key Lock:結合Gap Lock和Record Lock,鎖定一個範圍,並且鎖定記錄本身。主要解決的問題是REPEATABLE READ隔離級別下的幻讀。

注意,如果走唯一索引,那麼Next-Key Lock會降級為Record Lock,即僅鎖住索引本身,而不是範圍。也就是說Next-Key Lock前置條件為事務隔離級別為RR且查詢的索引走的非唯一索引、主鍵索引。

下面我們通過具體的例子來模擬上面出現的幻讀問題:

CREATE TABLE T (id int ,name varchar(50),f_id int,PRIMARY KEY (id), KEY(f_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into T SELECT 1,'張三',10;
insert into T SELECT 2,'李四',30;

InnoDB在資料庫中會為索引維護一套B+樹,用來快速定位行記錄。B+索引樹是有序的,所以會把這張表的索引分割成幾個區間。

被面試官吊打系列 - 事務隔離級別 - 天天要聞

事務A執行如下語句,需要將張三修改成李四。

select * from t;
update t set name = '李四' where f_id = 10;

這時SQL語句走非唯一索引,因此使用Next-Key Lock加鎖,不僅會給f_10=10的行加上行鎖,而且還會給這條記錄的兩邊添加上間隙鎖,即(-∞,10]、(10,30]這2個區間都加了間隙鎖。

被面試官吊打系列 - 事務隔離級別 - 天天要聞

此時如果B事務要執行如下語句,都會報錯[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

INSERT INTO T SELECT 3,'王五',10;  -- 滿足行鎖,執行阻塞
INSERT INTO T SELECT 4,'趙六',8;   -- 滿足間隙鎖,執行阻塞
INSERT INTO T SELECT 5,'孫七',18;  -- 滿足間隙鎖,執行阻塞

不僅插入 f_id = 10 的記錄需要等待事務A提交,f_id <1010< f_id <30 的記錄也無法完成,而大於等於30的記錄則不受影響,這足以解決幻讀問題了。

剛剛講的是f_id 是索引列的情況,那麼如果 f_id不是索引列會怎麼樣呢?

這時候資料庫會為整個表加上間隙鎖。所以,如果是沒有索引的話,不管 f_id 是否大於等於30,都要等待事務A提交才可以成功插入。

面試官:好了,各位看官朋友們,事務的隔離級別這個面試點你們清楚了嗎?希望你們的面試不會被這個問題難倒喲~

小張:學到了學到了,我下次再來。(趕緊回去把簡歷上的精通資料庫給刪掉。)


以上,希望對你有所幫助!

知識在於一點一滴的積累,滴水穿石!

科技分類資訊推薦

無線信號增強秘籍,橋接和中繼模式哪個更強? - 天天要聞

無線信號增強秘籍,橋接和中繼模式哪個更強?

【ZOL中關村在線原創技術解析】隨著無線通信與計算機技術飛速發展,人們愈發渴望隨時隨地享受穩定的數據通信服務。無線路由器作為無線網路核心設備,作用關鍵。但當其信號覆蓋不足,如穿過兩堵牆後信號微弱時,可通過無線橋接或中繼模式連接兩個無線路由器,擴展網路、增強信號。中繼模式和橋接模式雖都能擴展網路覆蓋,但...
流暢更耐用 魅族Note 16將預裝Flyme 12 - 天天要聞

流暢更耐用 魅族Note 16將預裝Flyme 12

魅族官方透露,將於5月發布的魅族Note 16系列將出廠預裝Flyme 12新系統,這也是Flyme系統大版本首次在非旗艦機型上首發。魅族Note 16搭載紫光展銳T765處理器,配備6.78英寸LCD屏,解析度達2460*1080。後置採用八邊形相機模組,由5000萬像素主攝和200萬像素鏡頭組成。續航方面,內置6600mAh大容量電池,支持40W有線充電
跨境電商迎「成本地震」,行業洗牌加速 - 天天要聞

跨境電商迎「成本地震」,行業洗牌加速

【環球網財經綜合報道】近日,美國正式終止了對中國價值不超過800美元的小額包裹免徵關稅的政策,這一變化引發了中國跨境電商行業的連鎖反應。多家物流公司隨即調整策略,物流費用普遍上漲,並增加了高額預收稅金。(圖片來源:東方IC)美國的800美元小額免稅政策(De Minimis)自2016年實施以來,極大地推動了全球跨境電商...
音樂節超時粉絲吵上熱搜!羅雲熙周深發布聯合說明 - 天天要聞

音樂節超時粉絲吵上熱搜!羅雲熙周深發布聯合說明

5月4日,太湖灣音樂節組委會「關於5月1日太湖灣音樂節的相關討論」,聯合羅雲熙工作室、周深工作室作出如下說明:在演出過程中,現場因節奏調整產生變化,相關團隊均已積極協作,確保了整體流程順利完成。對於由此引發的相關關注,我們充分理解大家的關心
國外一公司推出「空中自行車」:可垂直起飛、極速200公里/時 - 天天要聞

國外一公司推出「空中自行車」:可垂直起飛、極速200公里/時

快科技5月5日消息,近日,國外一家名為Volonaut的新成立公司推出了一款 「空中自行車」,這是一款具有創新性和顛覆性的飛行載具。其由Jetson One(註:一款飛行器)創造者托馬斯・帕坦(Tomasz Patan)在波蘭研發,其設計靈感源自科幻電影,尤其是《星球大戰》中的飛行摩托。外觀上沒有傳統飛行器的冗餘結構,僅見容納推進...
全球首款雙形態人形機器人正式發布! - 天天要聞

全球首款雙形態人形機器人正式發布!

前言首次定義具身人形機器人商用範式。近日消息,全球首款雙形態人形機器人——數字華夏IP系列開山之作星行俠P01正式發布。顏值高、智商高、易使用首次定義具身人形機器人商用範式據悉,數字華夏推出IP系列的初衷,是打造屬於這個時代的「商用機器人」。「外形潮流時尚、智商情商兼具、使用維護極簡,首次定義具身人形機...
三星One UI 8測試版或下月推出 給後續修復留出時間 - 天天要聞

三星One UI 8測試版或下月推出 給後續修復留出時間

【CNMO科技消息】三星已經開始內部測試全新的One UI 8系統,同時也在包括Galaxy Z Flip6在內的多款設備上進行適配測試。按照目前的進度來看,這次更新的到來時間可能比很多人預想得更早,有可能會在今年7月或8月之前就正式推出。 和以往一樣,三星應該會先上線One UI 8的測試版計劃,給部分用戶提前嘗鮮的機會。根據最新消...
蘋果引入Anthropic開發的Claude AI系統 欲放棄自研? - 天天要聞

蘋果引入Anthropic開發的Claude AI系統 欲放棄自研?

【CNMO科技消息】蘋果最近開始引入Anthropic公司開發的Claude AI系統,用於協助其工程師更高效地編寫代碼。 長期以來,蘋果一直堅持自主研發核心技術,很少依賴外部力量。但這一次,它選擇與Anthropic合作,將後者的Claude Sonnet模型集成到自家開發工具Xcode的升級版本中。據彭博社報道,這項合作已經開始在內部落地,主要...