偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

你好,面試官 | 我可以憑借MySQL架構(gòu)體系,事務(wù)鎖機(jī)制原理進(jìn)你公司嗎???

數(shù)據(jù)庫(kù) MySQL
RR隔離界別并沒(méi)有完全解決幻讀,只使用快照讀(使用MVCC解決了幻讀)或則當(dāng)前讀(間隙鎖解決幻讀)不會(huì)幻讀。若先快照讀,然后當(dāng)前讀,期間按快照讀相同條件插入數(shù)據(jù),當(dāng)前讀就又會(huì)發(fā)生幻讀。

面試現(xiàn)場(chǎng)

叮叮叮......

面試官:“你好,我是XX面試官,請(qǐng)問(wèn)是小龍嗎?”

小龍:“您好,面試官,我是小龍”

面試官:“好的,現(xiàn)在有空嗎,我們開(kāi)始面試吧”

小龍:“嗯嗯,準(zhǔn)備好啦”

.......

other questions

.......

面試官:“好的,我們先根據(jù)你簡(jiǎn)歷聊聊哈,我看你有提到熟悉 MySQL的使用嗎 ?。”

小龍:“哈哈,還算可以吧!”

面試官:“那你能告訴我 MySQL 大體的一個(gè)架構(gòu)是怎樣的嗎?有去了解過(guò)嗎?”

小龍:“MySQL 分為 Server 層與 存儲(chǔ)引擎層,Server 層包含連接器、分析器、優(yōu)化器、執(zhí)行器?!?/p>

面試官:“那現(xiàn)在假如我執(zhí)行一條 SQL 語(yǔ)句 select name from xl_tb where 主鍵ID=1,你覺(jué)得 MySQL 底層是怎樣去解析執(zhí)行這條 SQL 的呢?”

小龍:“首先要由我們的客戶(hù)端去連接服務(wù)器,需要連接器進(jìn)行身份驗(yàn)證,權(quán)限認(rèn)證?!?/p>

小龍:“然后在MySQL8.0之前,如果開(kāi)啟了緩存,執(zhí)行這條 SQL 的話會(huì)首先以這條 SQL 為 key 去緩存查詢(xún)是否有對(duì)應(yīng)的 value,如果有直接返回結(jié)果,MySQL8.0 在綜合考慮其優(yōu)劣后移除了緩存?!?/p>

面試官:“嗯嗯,那假如沒(méi)有開(kāi)啟緩存,或者沒(méi)有該 SQL 映射的結(jié)果呢?”

小龍:“那么便會(huì)正式解析這條 SQL 去查詢(xún)結(jié)果啦?!?/p>

面試官:“能簡(jiǎn)單說(shuō)說(shuō)是怎樣解析 SQL 的嗎?”

小龍:“服務(wù)器肯定不會(huì)什么語(yǔ)句都給你去執(zhí)行一遍,首先它會(huì)利用分析器通過(guò)詞法語(yǔ)法分析看這條語(yǔ)句是否符合它的語(yǔ)法規(guī)則,并解析關(guān)鍵詞等”

小龍:“如果語(yǔ)法沒(méi)問(wèn)題,也不能就這么拿去執(zhí)行了,因?yàn)橐紤]執(zhí)行代價(jià)成本之類(lèi)的。”

面試官:“那它內(nèi)部是怎么做的呢?”

小龍:“MySQL 會(huì)通過(guò)優(yōu)化器生成該 SQL語(yǔ)句的執(zhí)行計(jì)劃,我們可以通過(guò) explain 命令查詢(xún)。然后若你用到了索引可能還會(huì)選擇索引,它會(huì)選擇最優(yōu)的方案去執(zhí)行,因?yàn)榧词鼓闶褂昧怂饕谀承┣闆r可能也沒(méi)有全表掃描來(lái)的快。”

小龍:“這里,肯定就走主鍵索引,根據(jù) ID=1 去查?!?/p>

面試官:“enen,那得到最優(yōu)執(zhí)行方案后,最后是怎樣執(zhí)行的呢?”

小龍:“最后語(yǔ)句來(lái)到執(zhí)行器,打開(kāi)表調(diào)用存儲(chǔ)引擎接口,逐行判斷是否滿(mǎn)足查詢(xún)條件,當(dāng)然如果用到索引,會(huì)根據(jù)索引來(lái)篩選,速度也會(huì)更快,這里便是利用主鍵索引去查詢(xún) ID=1 的結(jié)果?!?/p>

小龍:“然后把滿(mǎn)足條件的放到結(jié)果集,最后返給客戶(hù)端顯示?!?/p>

面試官:“嗯嗯,理解的還是很清楚。OK,知道 MySQL 事務(wù)的四大特性嗎?”

獨(dú)白:“這個(gè)就很基礎(chǔ)?!?/p>

小龍:“ ACID,原子性,隔離性,持久性,一致性”

面試官:“OK,那你知道它們底層是怎樣實(shí)現(xiàn)的嗎,隨便挑兩個(gè)講講?”

獨(dú)白:“這個(gè)在我【面試筆記】中詳細(xì)總結(jié)過(guò)啦,隨便給面試官舉幾個(gè)吧。”

小龍:“比如原子性吧,我們知道實(shí)現(xiàn)原子性的關(guān)鍵是,事務(wù)回滾時(shí)能夠撤銷(xiāo)所有已經(jīng)成功執(zhí)行的 SQL 語(yǔ)句。”

小龍:“而當(dāng)事務(wù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改時(shí),InnoDB 會(huì)生成對(duì)應(yīng)的 undo log,undo log 會(huì)保存事務(wù)開(kāi)始前老版本的數(shù)據(jù),當(dāng)事務(wù)發(fā)生異常,便會(huì) rollback 回滾到老版本狀態(tài)?!?/p>

面試官:“那它是怎樣回滾的呢?”

小龍:“InnoDB 會(huì)根據(jù) undo log 的內(nèi)容做相反邏輯操作,比如:insert 語(yǔ)句,回滾時(shí)會(huì)執(zhí)行 delete,update 語(yǔ)句,回滾時(shí)便執(zhí)行相反的 update,把數(shù)據(jù)改回來(lái)?!?/p>

小龍:“總之,原子性主要便是靠 undo log 保證 。它是一種回滾日志,不僅可以用來(lái)保證原子性,還可以用來(lái)實(shí)現(xiàn)隔離性 MVCC?!?/p>

小龍:”MYSQL的持久性便是由redo log來(lái)保證。它可以記錄事務(wù)開(kāi)啟后對(duì)數(shù)據(jù)做的修改,并且可以進(jìn)行 crash-safe,數(shù)據(jù)庫(kù)異常斷電等情況可用 redo log恢復(fù)?!?/p>

面試官:“你知道這里面用到的一種 WAL 技術(shù)嗎?”

小龍:”MySQL 利用的 WAL 技術(shù),全稱(chēng)是Write-Ahead Logging 。關(guān)鍵點(diǎn)就是先寫(xiě)日志,再寫(xiě)磁盤(pán)。“

小龍:“可以把 redo log 比作一個(gè)卸貨的小推車(chē),我們卸貨若是每下一件物品就拿著去入庫(kù),那豈不是特浪費(fèi)時(shí)間(效率低、還要找到合適存庫(kù)位置)”

小龍:“此時(shí),若有一個(gè)小推車(chē),我們將貨物首先存放在小推車(chē),當(dāng)推車(chē)滿(mǎn)了再往庫(kù)里存,豈不大大增加了效率?!?/p>

小龍:“我們?cè)诟聰?shù)據(jù)庫(kù)時(shí),就是先將更新操作記錄在redo log日志,等 redo log 滿(mǎn)了或則 MYSQL 空閑了再刷盤(pán)?!?/p>

獨(dú)白:“由于篇幅原因,這里沒(méi)有詳細(xì)歸納總結(jié),有興趣的可以看【面試筆記】,里面對(duì)相關(guān)核心重點(diǎn)大廠??嫉亩荚敿?xì)總結(jié)啦?!?/p>

面試官:“OK,由于時(shí)間原因,這塊我們就聊到這,你知道事務(wù)中存在的一些并發(fā)問(wèn)題嗎?”

小龍:“理論上會(huì)存在臟讀、不可重復(fù)讀、幻讀,但是可以通過(guò)使用不同隔離級(jí)別就行控制的。”

面試官:“能給我講講什么是幻讀嗎?”

小龍:“舉個(gè)簡(jiǎn)單例子,比如事務(wù)A 按照一定條件進(jìn)行數(shù)據(jù)讀取, 期間事務(wù)B 插入了相同搜索條件的新數(shù)據(jù),事務(wù)A再次按照原先條件進(jìn)行讀取時(shí),發(fā)現(xiàn)了事務(wù)B 新插入的數(shù)據(jù) 稱(chēng)為幻讀?!?/p>

面試官:“那你能告訴我MySQL 是怎樣去解決幻讀的嗎?或者根本就還沒(méi)解決,談?wù)勀愕睦斫?”

獨(dú)白:“由于篇幅原因,這里只做簡(jiǎn)單總結(jié),有興趣的可以看【面試筆記】,通過(guò)實(shí)驗(yàn)詳細(xì)進(jìn)行了分析,可以幫助更好的理解。”

友情提示:不要相信網(wǎng)上眾說(shuō)紛紜的帖子,你抄我我抄你,一會(huì)這個(gè)說(shuō)RR隔離級(jí)別徹底解決了幻讀,一會(huì)那個(gè)說(shuō)沒(méi)有。最好自己親自做實(shí)驗(yàn)看看,結(jié)果一目了然。

我當(dāng)時(shí)為了這個(gè)困惑,百度都查爛了,帖子滿(mǎn)天飛,答案混淆視聽(tīng),最后干脆自己做實(shí)驗(yàn)最后得出正確結(jié)論,并詳細(xì)記錄在【面試筆記】中。

小龍:“RR隔離界別并沒(méi)有完全解決幻讀,只使用快照讀(使用MVCC解決了幻讀)或則當(dāng)前讀(間隙鎖解決幻讀)不會(huì)幻讀。若先快照讀,然后當(dāng)前讀,期間按快照讀相同條件插入數(shù)據(jù),當(dāng)前讀就又會(huì)發(fā)生幻讀。

當(dāng)時(shí)秋招網(wǎng)易云二面,我清楚記得我憑借這個(gè)問(wèn)題徹底征服了面試官,從頭到位給他清楚分析了一遍,最后即使我二本也拿了SP,不過(guò)拒了。

面試官:“真的不錯(cuò),順便問(wèn)一下,你能簡(jiǎn)單說(shuō)說(shuō)隔離級(jí)別機(jī)制實(shí)現(xiàn)原理嗎?”

可能有些同學(xué)會(huì)說(shuō)這些不會(huì)問(wèn),但是很多面試都會(huì)拐著彎問(wèn)你這,只是你不知道。

當(dāng)時(shí)我面試時(shí)面試官?zèng)]有直接這樣問(wèn),我是當(dāng)它問(wèn)了事務(wù)開(kāi)始我就一步一步留線索讓它順著我拿手的知識(shí)問(wèn),由于這樣寫(xiě)文章會(huì)很長(zhǎng),我就直接上問(wèn)題了。

小龍:“在讀未提交下,可以直接讀取數(shù)據(jù),并不能解決任何并發(fā)問(wèn)題?!?/p>

小龍:“而可串行化,它主要使用鎖,讀加共享鎖,寫(xiě)加排他鎖,串行執(zhí)行來(lái)實(shí)現(xiàn)?!?/p>

小龍:“而讀已提交和可重復(fù)讀實(shí)現(xiàn)原理就是MVCC Read View不同的生成時(shí)機(jī)??芍貜?fù)讀只在事務(wù)開(kāi)始時(shí)生成一個(gè)Read View,之后都用的這個(gè);讀已提交每次執(zhí)行前都會(huì)生成Read View?!?/p>

獨(dú)白:“這里關(guān)于 Read View 就不展開(kāi)講了,由于篇幅有限。改期再拿出來(lái)講?!?/p>

面試官:“好的,時(shí)間差不多啦,今天暫時(shí)聊那么多,下期再談?wù)?。?/p>

獨(dú)白:“不愧是我,真男人是也!”

本文轉(zhuǎn)載自微信公眾號(hào)「小龍coding」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系小龍coding公眾號(hào)。

責(zé)任編輯:武曉燕 來(lái)源: 小龍coding
相關(guān)推薦

2022-02-11 19:06:29

MySQL索引面試官

2021-09-01 07:21:41

面試官開(kāi)發(fā)讀寫(xiě)鎖

2024-08-12 17:36:54

2013-03-05 10:24:51

創(chuàng)業(yè)硅谷面試官

2015-08-13 10:29:12

面試面試官

2025-06-17 08:35:00

2020-04-09 13:38:40

MySQL數(shù)據(jù)庫(kù)臟讀

2021-09-08 08:06:57

Redis原子性數(shù)據(jù)類(lèi)型

2022-04-19 07:31:28

事務(wù)隔離機(jī)制數(shù)據(jù)庫(kù)

2020-08-13 10:15:34

MySQL數(shù)據(jù)庫(kù)面試

2022-11-04 08:47:52

底層算法數(shù)據(jù)

2019-07-26 06:42:28

PG架構(gòu)數(shù)據(jù)庫(kù)

2021-12-02 08:19:06

MVCC面試數(shù)據(jù)庫(kù)

2024-07-22 14:09:22

@AsyncJava

2024-08-26 14:52:58

JavaScript循環(huán)機(jī)制

2025-03-07 00:00:10

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2020-12-09 10:29:53

SSH加密數(shù)據(jù)安全

2023-10-13 00:00:00

并發(fā)樂(lè)觀鎖CAS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)