在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于MySQL事務一個多小時的面試 太難了

數據分析與開發 ? 來源:數據分析與開發 ? 作者:數據分析與開發 ? 2020-09-24 15:39 ? 次閱讀

迎面走來了一個風塵仆仆的身穿格子衫的男子,手里拿著一個MacBook Pro,看著那稀少的發量,和那從容淡定的眼神。

我心里一顫,我去,這是架構師,架構師來面我技術面,我心里頓時不淡定了,表面很穩實則心里慌得一批。

果然,他手里拿著我的簡歷,快速的掃了一下,然后用眼角余光看了一下我,上來就開問。

面試官:看你簡歷上說精通Mysql優化方法,你先來說說你對Mysql的事務的了解吧。

我心里喜了一下,這個簡單啊,哥我可是北大(背大)的,再來面試之前,早就有準備的,二話不說,上去就是背。

我:好的,數據庫的事務是指一組sql語句組成的數據庫邏輯處理單元,在這組的sql操作中,要么全部執行成功,要么全部執行失敗。

我:這里的一組sql操作,舉個簡單又經典的例子就是轉賬了,事務A中要進行轉賬,那么轉出的賬號要扣錢,轉入的賬號要加錢,這兩個操作都必須同時執行成功,為了確保數據的一致性。

面試官:剛才你提到了數據一致性,你知道事務的特性嗎?說說你的理解。

我:在Mysql中事務的四大特性主要包含:原子性(Atomicity)、一致性(Consistent)、隔離性(Isalotion)、持久性(Durable),簡稱為ACID。

我:原子性是指事務的原子性操作,對數據的修改要么全部執行成功,要么全部失敗,實現事務的原子性,是基于日志的Redo/Undo機制。

我:一致性是指執行事務前后的狀態要一致,可以理解為數據一致性。隔離性側重指事務之間相互隔離,不受影響,這個與事務設置的隔離級別有密切的關系。

我:持久性則是指在一個事務提交后,這個事務的狀態會被持久化到數據庫中,也就是事務提交,對數據的新增、更新將會持久化到數據庫中。

我:在我的理解中,原子性、隔離性、持久性都是為了保障一致性而存在的,一致性也是最終的目的。

心里暗自歡喜,背完了,平時背的多,面試就會說,幸好難不倒我。

面試官:剛才你說原子性是基于日志的Redo/Undo機制,你能說一說Redo/Undo機制嗎?

啊哈?我都說了什么,不小心給自己埋了一顆大雷。不慌,哥腦子里還有貨,假裝若有所思的停了幾十秒,接著背。

我:Redo/Undo機制比較簡單,它們將所有對數據的更新操作都寫到日志中。

我:Redo log用來記錄某數據塊被修改后的值,可以用來恢復未寫入 data file 的已成功事務更新的數據;Undo log是用來記錄數據更新前的值,保證數據更新失敗能夠回滾。

我:假如數據庫在執行的過程中,不小心崩了,可以通過該日志的方式,回滾之前已經執行成功的操作,實現事務的一致性。

面試官:可以舉一個場景,說一下具體的實現流程嗎?

我:可以的,假如某個時刻數據庫崩潰,在崩潰之前有事務A和事務B在執行,事務A已經提交,而事務B還未提交。當數據庫重啟進行 crash-recovery 時,就會通過Redo log將已經提交事務的更改寫到數據文件,而還沒有提交的就通過Undo log進行roll back。

面試官:之前你還提到事務的隔離級別,你能說一說嗎?

我:可以的,在Mysql中事務的隔離級別分為四大等級,讀未提交(READ UNCOMMITTED)、讀提交 (READ COMMITTED)、可重復讀 (REPEATABLE READ)、串行化 (SERIALIZABLE)。

我:讀未提交會讀到另一個事務的未提交的數據,產生臟讀問題,讀提交則解決了臟讀的,出現了不可重復讀,即在一個事務任意時刻讀到的數據可能不一樣,可能會受到其它事務對數據修改提交后的影響,一般是對于update的操作。

我:可重復讀解決了之前不可重復讀和臟讀的問題,但是由帶來了幻讀的問題,幻讀一般是針對inser操作。

我:例如:第一個事務查詢一個User表id=100發現不存在該數據行,這時第二個事務又進來了,新增了一條id=100的數據行并且提交了事務。

我:這時第一個事務新增一條id=100的數據行會報主鍵沖突,第一個事務再select一下,發現id=100數據行已經存在,這就是幻讀。

面試官:小伙子你能演示一下嗎?我不太會你能教教我嗎?我電腦在這里,你演示我看一看。

男人的嘴騙人的鬼,我信你個鬼,你這糟老頭子壞得很,出來裝X總是要還的,只能默默含淚把它敲完。

我:首先創建一個User表,最為一個測試表,測試表里面有三個字段,并插入兩條測試數據。

CREATE TABLE User ( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INTDEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=gb2312; INSERT INTO `user` VALUES (1, 'zhangsan', 23); INSERT INTO `user` VALUES (2, 'lisi', 20);

我:在Mysql中可以先查詢一下他的默認隔離級別,可以看出Mysql的默認隔離級別是REPEATABLE-READ。

我:先來演示一下讀未提交,先把默認的隔離級別修改為READ UNCOMMITTED。

我:他設置隔離級別的語句中set global transaction isolation level read uncommitted,這里的global也可以換成session,global表示全局的,而session表示當前會話,也就是當前窗口有效。

我:當設置完隔離級別后對于之前打開的會話,是無效的,要重新打開一個窗口設置隔離級別才生效。

我:然后是開啟事務,Mysql中開啟事務有兩種方式begin/start transaction,最后提交事務執行commit,或者回滾事務rollback。

我:在執行begin/start transaction命令,它們并不是一個事務的起點,在執行完它們后的第一個sql語句,才表示事務真正的啟動 。

我:這里直接打開兩個新的窗口,同時開啟事務,在第一個窗口先update一個id=1的數據行name改為'非科班的科班',執行成功。

我:然后再第二個窗口執行兩次的查詢,分別是窗口一update之前的查詢和update之后的查詢。

我:第一個session產生的未提交的事務的狀態就會直接影響到第二sesison,也就是臟讀。

我:對于讀提交也是一樣的,開啟事務后,第一個事務先執行查詢數據,然后第二個session執行update操作,但是還沒有commit,這是第一個session再次select,數據并沒有改變,再第二個session執行commit之后,第一個session再次select就是改變后的數據了。

我:這樣第一個事務的查詢結果就會收到第二事務的影響,這個也就是產生不可重復讀的問題。

面試官:小伙子你能畫一下他執行的過程圖嗎?你講的我有點亂,我還沒有徹底明白。

我心里一萬只什么馬在飛過,欲哭無淚,這面試官真難伺候,說時遲那時快,從左屁股兜抽出筆,從右屁股兜拿出紙,開始畫。

我:這個是讀提交的時間軸圖,讀未提交的時間軸圖,原理也一樣的,第二個select的時候數據就已經改變了。

這是面試官拿過我的圖看了一點,微微的點了點頭,嘴角露出思思的笑意,我想你這糟老頭子應該不會再刁難我了吧。

面試官:嗯,你接著演示你的可重復讀吧。

我:嗯,好的,然后就是可重復讀,和之前一樣的操作。

我:將兩個session開啟為REPEATABLE READ,同時開啟事務,在第一個事務中先select,然后在第二個事務里面update數據行,可以發現即使第二個事務已經commit,第一個事務再次select數據也還是沒有改變,這就解決了不可重復讀的問題。

我:這里有個不同的地方就是在Mysql中,默認的不可重復讀個隔離級別也解決了幻讀的問題。

我:從上面的演示中可以看出第一個事務中先select一個id=3的數據行,這條數據行是不存在的,返回Empty set,然后第二個事務中insert一條id=3的數據行并且commit,第一個事務中再次select的,數據也好是沒有id=3的數據行。

我:最后的串行化,樣式步驟也是一樣的,結果也和Mysql中默認的個可重復讀隔離級別的結果一樣,串行化的執行流程相當于把事務的執行過程變為順序執行,我這邊就不再做演示了。

我:這四大等級從上到下,隔離的效果是逐漸增強,但是性能卻是越來越差。

面試官:哦?性能越來越差?為什么會性能越來越差?你能說一說原因嗎?

哎呀,我這嘴,少說一句會死啊,這下好了,這個得說底層實現原理了,從原來的假裝若有所思,變成了真正得若有所思。

我:這個得從Mysq的鎖說起,在Mysql中的鎖可以分為分享鎖/讀鎖(Shared Locks)、排他鎖/寫鎖(Exclusive Locks)、間隙鎖、行鎖(Record Locks)、表鎖。

我:在四個隔離級別中加鎖肯定是要消耗性能的,而讀未提交是沒有加任何鎖的,所以對于它來說也就是沒有隔離的效果,所以它的性能也是最好的。

我:對于串行化加的是一把大鎖,讀的時候加共享鎖,不能寫,寫的時候,加的是排它鎖,阻塞其它事務的寫入和讀取,若是其它的事務長時間不能寫入就會直接報超時,所以它的性能也是最差的,對于它來就沒有什么并發性可言。

我:對于讀提交和可重復讀,他們倆的實現是兼顧解決數據問題,然后又要有一定的并發行,所以在實現上鎖機制會比串行化優化很多,提高并發性,所以性能也會比較好。

我:他們倆的底層實現采用的是MVCC(多版本并發控制)方式進行實現。

面試官:你能先說一下先這幾個鎖的概念嗎?我不是很懂,說說你的理解。

我:哦,好的,共享鎖是針對同一份數據,多個讀操作可以同時進行,簡單來說即讀加鎖,不能寫并且可并行讀;排他鎖針對寫操作,假如當前寫操作沒有完成,那么它會阻斷其它的寫鎖和讀鎖,即寫加鎖,其它讀寫都阻塞 。

我:而行鎖和表鎖,是從鎖的粒度上進行劃分的,行鎖鎖定當前數據行,鎖的粒度小,加鎖慢,發生鎖沖突的概率小,并發度高,行鎖也是MyISAM和InnoDB的區別之一,InnoDB支持行鎖并且支持事務 。

我:而表鎖則鎖的粒度大,加鎖快,開銷小,但是鎖沖突的概率大,并發度低。

我:間隙鎖則分為兩種:Gap Locks和Next-Key Locks。Gap Locks會鎖住兩個索引之間的區間,比如select * from User where id>3 and id<5 for update,就會在區間(3,5)之間加上Gap Locks。

我:Next-Key Locks是Gap Locks+Record Locks形成閉區間鎖select * from User where id>=3 and id=<5 for update,就會在區間[3,5]之間加上Next-Key Locks。

面試官:那Mysql中什么時候會加鎖呢?

我:在數據庫的增、刪、改、查中,只有增、刪、改才會加上排它鎖,而只是查詢并不會加鎖,只能通過在select語句后顯式加lock in share mode或者for update來加共享鎖或者排它鎖。

面試官:你在上面提到MVCC(多版本并發控制),你能說一說原理嗎?

我:在實現MVCC時用到了一致性視圖,用于支持讀提交和可重復讀的實現。

我:在實現可重復讀的隔離級別,只需要在事務開始的時候創建一致性視圖,也叫做快照,之后的查詢里都共用這個一致性視圖,后續的事務對數據的更改是對當前事務是不可見的,這樣就實現了可重復讀。

我:而讀提交,每一個語句執行前都會重新計算出一個新的視圖,這個也是可重復讀和讀提交在MVCC實現層面上的區別。

面試官:那你知道快照(視圖)在MVCC底層是怎么工作的嗎?

我:在InnoDB 中每一個事務都有一個自己的事務id,并且是唯一的,遞增的 。

我:對于Mysql中的每一個數據行都有可能存在多個版本,在每次事務更新數據的時候,都會生成一個新的數據版本,并且把自己的數據id賦值給當前版本的row trx_id。

面試官:小伙子你可以畫個圖我看看嗎?我不是很明白。

我有什么辦法呢?完全沒辦法,只能又從屁股兜里拿出筆和紙,迅速的畫了起來,要是這次面試不過就血虧啊,浪費了我兩張紙和筆水,現在的筆和紙多貴啊,只能豁出去了。

我:如圖中所示,假如三個事務更新了同一行數據,那么就會有對應的三個數據版本。

我:實際上版本1、版本2并非實際物理存在的,而圖中的U1和U2實際就是undo log,這v1和v2版本是根據當前v3和undo log計算出來的。

面試官:那對于一個快照來說,你知道它要遵循什么規則嗎?

我:嗯,對于一個事務視圖來說除了對自己更新的總是可見,另外還有三種情況:版本未提交的,都是不可見的;版本已經提交,但是是在創建視圖之后提交的也是不可見的;版本已經提交,若是在創建視圖之前提交的是可見的。

面試官:假如兩個事務執行寫操作,又怎么保證并發呢?

我:假如事務1和事務2都要執行update操作,事務1先update數據行的時候,先回獲取行鎖,鎖定數據,當事務2要進行update操作的時候,也會取獲取該數據行的行鎖,但是已經被事務1占有,事務2只能wait。

我:若是事務1長時間沒有釋放鎖,事務2就會出現超時異常 。

面試官:這個是在update的where后的條件是在有索引的情況下吧?

我:嗯,是的 。

面試官:那沒有索引的條件下呢?沒辦法快速定位到數據行呢?

我:若是沒有索引的條件下,就獲取所有行,都加上行鎖,然后Mysql會再次過濾符合條件的的行并釋放鎖,只有符合條件的行才會繼續持有鎖。

我:這樣的性能消耗也會比較大。

面試官:嗯嗯

此時面試官看看手表一個多鐘已經過去了,也已經到了飯點時刻,我想他應該是肚子餓了,不會繼續追問吧,兩人持續僵了三十秒,他終于開口了。

面試官:小伙子,現在時間也已經到了飯點了,今天的面試就到此結束吧,你回去等通知吧。

我:。。。。。。。。。。

責任編輯:xj

原文標題:我以為我對 MySQL 事務很熟,直到我遇到了阿里面試官

文章出處:【微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7232

    瀏覽量

    90711
  • MySQL
    +關注

    關注

    1

    文章

    840

    瀏覽量

    27306

原文標題:我以為我對 MySQL 事務很熟,直到我遇到了阿里面試官

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    長沙怎么這么難招硬件工程師呀

    長沙好難招硬件工程師呀,大部分面試的只有課程設計經驗,沒有額外學習硬件或者動手做東西,招聘也太難了。有實力的請聯系 [email protected]*附件:HAOMIN 招聘啟事-初級硬件工程師.pdf
    發表于 04-10 15:44

    IGBT模塊:“我太難了”,老是炸毀?

    前言IGBT(絕緣柵雙極型晶體管)作為光伏逆變器的“心臟”,承擔著直流電向交流電轉換的核心任務。然而,這關鍵部件的炸毀問題頻發,不僅導致高昂的維修成本,還可能引發電站停機、發電量損失等連鎖反應。據
    的頭像 發表于 03-09 11:21 ?807次閱讀
    IGBT模塊:“我<b class='flag-5'>太難了</b>”,老是炸毀?

    硬件面試

    硬件面試
    的頭像 發表于 02-26 13:55 ?475次閱讀
    硬件<b class='flag-5'>面試</b>(<b class='flag-5'>一</b>)

    使用插件將Excel連接到MySQL/MariaDB

    ,可以快速地將數據從 MySQL 或 MariaDB 加載到 Excel,立即從數據庫刷新 Excel 工作簿中的數據,編輯這些數據,并將它們保存回 MySQL。之后您能夠像使用的 Excel 工作表
    的頭像 發表于 01-20 12:38 ?442次閱讀
    使用插件將Excel連接到<b class='flag-5'>MySQL</b>/MariaDB

    MySQL數據庫的安裝

    MySQL開源免費的關系型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬于 Oracle 旗下公司。 MySQL 最流行的
    的頭像 發表于 01-14 11:25 ?378次閱讀
    <b class='flag-5'>MySQL</b>數據庫的安裝

    面試題】人工智能工程師高頻面試題匯總:機器學習深化篇(題目+答案)

    隨著人工智能技術的突飛猛進,AI工程師成為了眾多求職者夢寐以求的職業。想要拿下這份工作,面試的時候得展示出你不僅技術過硬,還得能解決問題。所以,提前準備面試常問的問題,比如機器學習的那些算法
    的頭像 發表于 12-16 13:42 ?2476次閱讀
    【<b class='flag-5'>面試</b>題】人工智能工程師高頻<b class='flag-5'>面試</b>題匯總:機器學習深化篇(題目+答案)

    MySQL還能跟上PostgreSQL的步伐嗎

    Percona 的老板 Peter Zaitsev最近發表篇博客,討論了MySQL是否還能跟上PostgreSQL的腳步。Percona 作為MySQL 生態扛旗者,Percona 開發了知名
    的頭像 發表于 11-18 10:16 ?426次閱讀
    <b class='flag-5'>MySQL</b>還能跟上PostgreSQL的步伐嗎

    MySQL編碼機制原理

    前言 位讀者在本地部署 MySQL 測試環境時碰到問題,我覺得挺有代表性的,所以寫篇文章介紹下,看完相信你會對
    的頭像 發表于 11-09 11:01 ?465次閱讀

    Spring事務實現原理

    作者:京東零售 范錫軍 1、引言 spring的spring-tx模塊提供了對事務管理支持,使用spring事務可以讓我們從復雜的事務處理中得到解脫,無需要去處理獲得連接、關閉連接、事務
    的頭像 發表于 11-08 10:10 ?1039次閱讀
    Spring<b class='flag-5'>事務</b>實現原理

    程序員去面試只需技能征服所有面試官!

    車輛工程專業的研究生去面試面試官最后問他會不會嵌入式。雖然應聘的崗位不是嵌入式工程師,但看來老板還是希望他能懂點這方面的知識。這個小插曲就說明了
    的頭像 發表于 11-05 19:35 ?401次閱讀
    程序員去<b class='flag-5'>面試</b>只需<b class='flag-5'>一</b><b class='flag-5'>個</b>技能征服所有<b class='flag-5'>面試</b>官!

    適用于MySQL的dbForge架構比較

    dbForge Schema Compare for MySQL種工具,用于輕松有效地比較和部署 MySQL 數據庫結構和腳本文件夾差異。該工具提供了 MySQL 數據庫架構中所
    的頭像 發表于 10-28 09:41 ?429次閱讀
    適用于<b class='flag-5'>MySQL</b>的dbForge架構比較

    單片機按鍵中斷配置教程

    些小伙伴覺得單片機入門太難了,又要懂原理圖、又要懂寄存器、還要學編程語言。
    的頭像 發表于 10-23 16:30 ?1172次閱讀
    單片機按鍵中斷配置教程

    MySQL知識點匯總

    大家好,這部分被稱為DQL部分,是每個學習MySQL必須要學會的部分,下面就讓我來介紹MySQL中的其他部分。
    的頭像 發表于 08-05 15:27 ?549次閱讀
    <b class='flag-5'>MySQL</b>知識點匯總

    文了解MySQL索引機制

    接觸MySQL數據庫的小伙伴定避不開索引,索引的出現是為了提高數據查詢的效率,就像書的目錄樣。 某一個SQL查詢比較慢,你第時間想到的
    的頭像 發表于 07-25 14:05 ?473次閱讀
    <b class='flag-5'>一</b>文了解<b class='flag-5'>MySQL</b>索引機制

    MySQL的整體邏輯架構

    支持多種存儲引擎是眾所周知的MySQL特性,也是MySQL架構的關鍵優勢之。如果能夠理解MySQL Server與存儲引擎之間是怎樣通過API交互的,將大大有利于理解
    的頭像 發表于 04-30 11:14 ?612次閱讀
    <b class='flag-5'>MySQL</b>的整體邏輯架構
    主站蜘蛛池模板: 性欧美日本 | 日色视频| 中文字幕有码视频 | 成人性欧美丨区二区三区 | 在线精品小视频 | 黄色录像大全 | 日本免费人成在线网站 | 伦理片日本韩国电影三级在线观看 | 夜夜夜夜曰天天天天拍国产 | 欧美日韩国产另类一区二区三区 | 在线免费观看视频 | 亚洲欧美日韩色图 | 免费看va| 国产巨大bbbb俄罗斯 | 亚洲成人77777 | 久久青草精品一区二区三区 | 男人日女人视频免费看 | 欧美一级日韩在线观看 | 性殴美高清视频 | 丁香激情小说 | 日本一区三区二区三区四区 | 美女喷白浆视频 | 伊人久久大线蕉香港三级 | 欧美综合一区二区三区 | 欧美色图综合 | 日韩毛片在线看 | 五月天婷婷在线视频 | 欧美片欧美日韩国产综合片 | 69国产| www.色妞| 能在线观看的一区二区三区 | 伊人丁香婷婷综合一区二区 | 毛片基地在线 | 亚洲精品91大神在线观看 | 久久婷人人澡人人爽 | 欧美aaaaa性bbbbb小妇 | 综合激情网五月 | 男人的天堂免费网站 | 久久99精品久久久久久园产越南 | 亚洲最大成人综合网 | 88av视频在线观看 |