自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

面試現(xiàn)場

叮叮叮......

面試官:“你好,我是XX面試官,請問是小龍嗎?”

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

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

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

.......

other questions

.......

面試官:“好的,我們先根據(jù)你簡歷聊聊哈,我看你有提到熟悉 MySQL的使用嗎 ??!?/p>

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

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

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

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

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

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

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

小龍:“那么便會正式解析這條 SQL 去查詢結(jié)果啦。”

面試官:“能簡單說說是怎樣解析 SQL 的嗎?”

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

小龍:“如果語法沒問題,也不能就這么拿去執(zhí)行了,因?yàn)橐紤]執(zhí)行代價成本之類的?!?/p>

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

小龍:“MySQL 會通過優(yōu)化器生成該 SQL語句的執(zhí)行計劃,我們可以通過 explain 命令查詢。然后若你用到了索引可能還會選擇索引,它會選擇最優(yōu)的方案去執(zhí)行,因?yàn)榧词鼓闶褂昧怂饕?,在某些情況可能也沒有全表掃描來的快?!?/p>

小龍:“這里,肯定就走主鍵索引,根據(jù) ID=1 去查。”

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

小龍:“最后語句來到執(zhí)行器,打開表調(diào)用存儲引擎接口,逐行判斷是否滿足查詢條件,當(dāng)然如果用到索引,會根據(jù)索引來篩選,速度也會更快,這里便是利用主鍵索引去查詢 ID=1 的結(jié)果。”

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

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

獨(dú)白:“這個就很基礎(chǔ)。”

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

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

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

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

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

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

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

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

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

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

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

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

小龍:“此時,若有一個小推車,我們將貨物首先存放在小推車,當(dāng)推車滿了再往庫里存,豈不大大增加了效率。”

小龍:“我們在更新數(shù)據(jù)庫時,就是先將更新操作記錄在redo log日志,等 redo log 滿了或則 MYSQL 空閑了再刷盤?!?/p>

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

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

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

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

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

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

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

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

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

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

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

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

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

當(dāng)時我面試時面試官沒有直接這樣問,我是當(dāng)它問了事務(wù)開始我就一步一步留線索讓它順著我拿手的知識問,由于這樣寫文章會很長,我就直接上問題了。

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

小龍:“而可串行化,它主要使用鎖,讀加共享鎖,寫加排他鎖,串行執(zhí)行來實(shí)現(xiàn)。”

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

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

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

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

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

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

2022-02-11 19:06:29

MySQL索引面試官

2021-09-01 07:21:41

面試官開發(fā)讀寫鎖

2024-08-12 17:36:54

2020-04-09 13:38:40

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

2013-03-05 10:24:51

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

2021-09-08 08:06:57

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

2022-04-19 07:31:28

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

2020-08-13 10:15:34

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

2015-08-13 10:29:12

面試面試官

2019-07-26 06:42:28

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

2022-11-04 08:47:52

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

2024-07-22 14:09:22

@AsyncJava

2021-12-02 08:19:06

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

2021-03-25 08:45:15

MySQL

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2025-03-07 00:00:10

2023-10-13 00:00:00

并發(fā)樂觀鎖CAS

2024-11-15 15:27:09

2025-04-07 00:00:00

MySQL數(shù)據(jù)庫服務(wù)器
點(diǎn)贊
收藏

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