免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

面試官:你說對(duì) MySQL 事務(wù)很熟?那我問你 10 個(gè)問題

:2020年04月01日 程序人生
分享到:

學(xué)習(xí)關(guān)系型數(shù)據(jù)庫(kù)MySQL是很好的切入點(diǎn),大部分人學(xué)習(xí)和工作中用慣了CRUD,對(duì)面試官刨根問底的靈魂拷問你還能對(duì)答如流嗎?我們有必要了解一些更深層次的數(shù)據(jù)庫(kù)基礎(chǔ)原理。整理了面試中,關(guān)于MySQL事務(wù)和存...

學(xué)習(xí)關(guān)系型數(shù)據(jù)庫(kù)MySQL是很好的切入點(diǎn),大部分人學(xué)習(xí)和工作中用慣了CRUD,對(duì)面試官刨根問底的靈魂拷問你還能對(duì)答如流嗎?我們有必要了解一些更深層次的數(shù)據(jù)庫(kù)基礎(chǔ)原理。

整理了面試中,關(guān)于MySQL事務(wù)和存儲(chǔ)引擎10個(gè)FAQ(Frequently asked questions),你想知道的都在這里。


點(diǎn)擊添加圖片描述(最多60個(gè)字)

什么是事務(wù)?

事務(wù)就是「一組原子性的SQL查詢」,或者說一個(gè)獨(dú)立的工作單元。如果數(shù)據(jù)庫(kù)引擎能夠成功地對(duì)數(shù)據(jù)庫(kù)應(yīng)用該組查詢的全部語句,那么就執(zhí)行該組查詢。如果其中有任何一條語句因?yàn)楸罎⒒蚱渌驘o法執(zhí)行,那么所有的語句都不會(huì)執(zhí)行。也就是說,事務(wù)內(nèi)的語句,要么全部執(zhí)行成功,要么全部執(zhí)行失敗。


點(diǎn)擊添加圖片描述(最多60個(gè)字)

事務(wù)控制語法知道嗎?

BEGIN 或 START TRANSACTION 顯式地開啟一個(gè)事務(wù);

COMMIT / COMMIT WORK二者是等價(jià)的。提交事務(wù),并使已對(duì)數(shù)據(jù)庫(kù)進(jìn)行的所有修改成為永久性的;

ROLLBACK / ROLLBACK WORK。回滾會(huì)結(jié)束用戶的事務(wù),并撤銷正在進(jìn)行的所有未提交的修改;

SAVEPOINT identifier 在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),一個(gè)事務(wù)中可以有多個(gè) SAVEPOINT;

RELEASE SAVEPOINT identifier 刪除一個(gè)事務(wù)的保存點(diǎn);

ROLLBACK TO identifier 把事務(wù)回滾到標(biāo)記點(diǎn);

SET TRANSACTION 用來設(shè)置事務(wù)的隔離級(jí)別。InnoDB 存儲(chǔ)引擎提供事務(wù)的隔離級(jí)別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE


點(diǎn)擊添加圖片描述(最多60個(gè)字)

用通俗的語言說說你理解的事務(wù)

用銀行業(yè)務(wù)舉個(gè)栗子,用戶lemon有兩銀行卡,一張是招商銀行CMBC的工資卡,另一張是工商銀行ICBC的儲(chǔ)蓄卡,每月10號(hào)發(fā)工資都要把招行卡的100萬轉(zhuǎn)到建設(shè)銀行儲(chǔ)蓄卡賬戶。記住這里的銀行縮寫后面就是對(duì)應(yīng)的數(shù)據(jù)表名稱,你要記不住,我給你理一理。

招商銀行(CMBC):“存么?白癡!”

中國(guó)工商銀行(ICBC): “愛存不存!”

中國(guó)建設(shè)銀行(CCB): “存?存不?”

中國(guó)銀行(BC): “不存!”

中國(guó)農(nóng)業(yè)銀行(ABC): “啊,不存!”

民生銀行(CMSB):“存么?SB!"

興業(yè)銀行(CIB):“存一百。”

國(guó)家開發(fā)銀行(CDB):“存點(diǎn)吧!”

匯豐銀行(HSBC):“還是不存!”

這個(gè)轉(zhuǎn)賬的操作可以簡(jiǎn)化抽成一個(gè)事務(wù),包含如下步驟:

  1. 查詢CMBC賬戶的余額是否大于100萬

  2. 從CMBC賬戶余額中減去100萬

  3. 在ICBC賬戶余額中增加100萬

以下語句對(duì)應(yīng)創(chuàng)建了一個(gè)轉(zhuǎn)賬事務(wù):

START TRANSACTION;

SELECT balance FROM CMBC WHERE username='lemon';

UPDATE CMBC SET balance = balance - 1000000.00 WHERE username = 'lemon';

UPDATE ICBC SET balance = balance + 1000000.00 WHERE username = 'lemon';

COMMIT;


點(diǎn)擊添加圖片描述(最多60個(gè)字)

事務(wù)的ACID特性是什么?

ACID其實(shí)是事務(wù)特性的英文首字母縮寫,具體的含義是這樣的:

  • 原子性(atomicity)

  • 一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小工作單元,整個(gè)事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾,對(duì)于一個(gè)事務(wù)來說,不可能只執(zhí)行其中的一部分操作。

  • 致性(consistency)

  • 數(shù)據(jù)庫(kù)總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另外一個(gè)一致性的狀態(tài)。在前面的例子中,一致性確保了,即使在執(zhí)行第三、四條語句之間時(shí)系統(tǒng)崩潰,CMBC賬戶中也不會(huì)損失100萬,不然lemon要哭死,因?yàn)槭聞?wù)最終沒有提交,所以事務(wù)中所做的修改也不會(huì)保存到數(shù)據(jù)庫(kù)中。

  • 隔離性(isolation)

  • 通常來說,一個(gè)事務(wù)所做的修改在最終提交以前,對(duì)其他事務(wù)是不可見的。在前面的例子中,當(dāng)執(zhí)行完第三條語句、第四條語句還未開始時(shí),此時(shí)如果有其他人準(zhǔn)備給lemon的CMBC賬戶存錢,那他看到的CMBC賬戶里還是有100萬的。

  • 持久性(durability)

  • 一旦事務(wù)提交,則其所做的修改就會(huì)永久保存到數(shù)據(jù)庫(kù)中。此時(shí)即使系統(tǒng)崩潰,修改的數(shù)據(jù)也不會(huì)丟失。持久性是個(gè)有點(diǎn)模糊的概念,因?yàn)閷?shí)際上持久性也分很多不同的級(jí)別。有些持久性策略能夠提供非常強(qiáng)的安全保障,而有些則未必。而且「不可能有能做到100%的持久性保證的策略」否則還需要備份做什么。


點(diǎn)擊添加圖片描述(最多60個(gè)字)

什么是臟讀、不可重復(fù)讀、幻讀

臟讀

在事務(wù)A修改數(shù)據(jù)之后提交數(shù)據(jù)之前,這時(shí)另一個(gè)事務(wù)B來讀取數(shù)據(jù),如果不加控制,事務(wù)B讀取到A修改過數(shù)據(jù),之后A又對(duì)數(shù)據(jù)做了修改再提交,則B讀到的數(shù)據(jù)是臟數(shù)據(jù),此過程稱為臟讀Dirty Read。

臟讀

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯

不可重復(fù)讀

一個(gè)事務(wù)內(nèi)在讀取某些數(shù)據(jù)后的某個(gè)時(shí)間,再次讀取以前讀過的數(shù)據(jù),卻發(fā)現(xiàn)其讀出的數(shù)據(jù)已經(jīng)發(fā)生了變更、或者某些記錄已經(jīng)被刪除了。

不可重復(fù)讀

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯

幻讀

事務(wù)A在按查詢條件讀取某個(gè)范圍的記錄時(shí),事務(wù)B又在該范圍內(nèi)插入了新的滿足條件的記錄,當(dāng)事務(wù)A再次按條件查詢記錄時(shí),會(huì)產(chǎn)生新的滿足條件的記錄(幻行 Phantom Row)

幻讀

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯

不可重復(fù)讀與幻讀有什么區(qū)別?

  • 不可重復(fù)讀的重點(diǎn)是修改:在同一事務(wù)中,同樣的條件,第一次讀的數(shù)據(jù)和第二次讀的「數(shù)據(jù)不一樣」。(因?yàn)橹虚g有其他事務(wù)提交了修改)

  • 幻讀的重點(diǎn)在于新增或者刪除:在同一事務(wù)中,同樣的條件,第一次和第二次讀出來的「記錄數(shù)不一樣」。(因?yàn)橹虚g有其他事務(wù)提交了插入/刪除)

四個(gè)隔離級(jí)別知道嗎?解決了什么問題

SQL實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的隔離級(jí)別,每一種級(jí)別都規(guī)定了一個(gè)事務(wù)中所做的修改,哪些在事務(wù)內(nèi)和事務(wù)間是可見的,哪些是不可見的。低級(jí)別的隔離級(jí)一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。

隔離級(jí)別

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯

各個(gè)隔離級(jí)別可以不同程度的解決臟讀、不可重復(fù)讀、幻讀。隔離級(jí)別各有所長(zhǎng),沒有完美的解決方案,脫離業(yè)務(wù)場(chǎng)景談具體實(shí)施都是耍流氓。

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯

隔離級(jí)別對(duì)比

MySQL中哪些存儲(chǔ)引擎支持事務(wù)?

MySQL中InnoDB和NDB Cluster存儲(chǔ)引擎提供了事務(wù)處理能力,以及其他支持事務(wù)的第三引擎。


點(diǎn)擊添加圖片描述(最多60個(gè)字)

什么是自動(dòng)提交?

MySQL默認(rèn)采用自動(dòng)提交AUTOCOMMIT模式。也就是說,如果不是顯式地開始一個(gè)事務(wù),則每個(gè)查詢都被當(dāng)作一個(gè)事務(wù)執(zhí)行提交操作。

對(duì)于MyISAM或者內(nèi)存表這些事務(wù)型的表,修改AUTOCOMMIT不會(huì)有任何影響。對(duì)這類表來說,沒有COMMIT或者ROLLBACK的概念,也可以說是相當(dāng)于一直處于AUTOCOMMIT啟用的模式。

在事務(wù)中可以混合使用存儲(chǔ)引擎嗎?

盡量不要在同一個(gè)事務(wù)中使用多種存儲(chǔ)引擎,MySQL服務(wù)器層不管理事務(wù),事務(wù)是由下層的存儲(chǔ)引擎實(shí)現(xiàn)的。

如果在事務(wù)中混合使用了事務(wù)型和非事務(wù)型的表(例如InnoDB和MyISAM表),在正常提交的情況下不會(huì)有什么問題。

但如果該事務(wù)需要回滾,非事務(wù)型的表上的變更就無法撤銷,這會(huì)導(dǎo)致數(shù)據(jù)庫(kù)處于不一致的狀態(tài),這種情況很難修復(fù),事務(wù)的最終結(jié)果將無法確定。所以,為每張表選擇合適的存儲(chǔ)引擎非常重要。


點(diǎn)擊添加圖片描述(最多60個(gè)字)

MySQL存儲(chǔ)引擎類型有哪些?

最常用的存儲(chǔ)引擎是InnoDB引擎和MyISAM存儲(chǔ)引擎,InnoDB是MySQL的默認(rèn)事務(wù)引擎。

查看數(shù)據(jù)庫(kù)表當(dāng)前支持的引擎 :

show table status from 'your_db_name' where name='your_table_name'; 

查詢結(jié)果表中的`Engine`字段指示存儲(chǔ)引擎類型。

InnoDB存儲(chǔ)引擎的特點(diǎn)和應(yīng)用場(chǎng)景?

InnoDB是MySQL的默認(rèn)「事務(wù)引擎」,被設(shè)置用來處理大量短期(short-lived)事務(wù),短期事務(wù)大部分情況是正常提交的,很少會(huì)回滾。

更多InnoDB事務(wù)模型相關(guān),參考MySQL官方手冊(cè),這里貼一下鏈接:https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-model.html

歷史

現(xiàn)代MySQL版本中的InnoDB在歷史上叫InnoDB plugin,這個(gè)MySQL插件在2008年被開發(fā)出來,直到2010在Oracle收購(gòu)了Sun公司后,發(fā)布的MySQL5.5才正式使用InnoDB plugin替代了舊版本的InnoDB,至此 「?jìng)涮ァ钩晒D(zhuǎn)正成為MySQL的御用引擎而不再是插件,你看一個(gè)插件都這么努力。

特點(diǎn)

采用多版本并發(fā)控制(MVCC,MultiVersion Concurrency Control)來支持高并發(fā)。并且實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的隔離級(jí)別,通過間隙鎖next-key locking策略防止幻讀的出現(xiàn)。

引擎的表基于聚簇索引建立,聚簇索引對(duì)主鍵查詢有很高的性能。不過它的二級(jí)索引secondary index非主鍵索引中必須包含主鍵列,所以如果主鍵列很大的話,其他的所有索引都會(huì)很大。因此,若表上的索引較多的話,主鍵應(yīng)當(dāng)盡可能的小。另外InnoDB的存儲(chǔ)格式是平臺(tái)獨(dú)立。

InnoDB做了很多優(yōu)化,比如:磁盤讀取數(shù)據(jù)方式采用的可預(yù)測(cè)性預(yù)讀、自動(dòng)在內(nèi)存中創(chuàng)建hash索引以加速讀操作的自適應(yīng)哈希索引(adaptive hash index),以及能夠加速插入操作的插入緩沖區(qū)(insert buffer)等。

InnoDB通過一些機(jī)制和工具支持真正的熱備份,MySQL的其他存儲(chǔ)引擎不支持熱備份,要獲取一致性視圖需要停止對(duì)所有表的寫入,而在讀寫混合場(chǎng)景中,停止寫入可能也意味著停止讀取。

MyISAM存儲(chǔ)引擎的特點(diǎn)和應(yīng)用場(chǎng)景?

MyISAM是MySQL 5.1及之前的版本的默認(rèn)的存儲(chǔ)引擎。MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(shù)(GIS)等,但MyISAM不「支持事務(wù)和行級(jí)鎖」,對(duì)于只讀數(shù)據(jù),或者表比較小、可以容忍修復(fù)操作,依然可以使用它。

特性

MyISAM「不支持行級(jí)鎖而是對(duì)整張表加鎖」。讀取時(shí)會(huì)對(duì)需要讀到的所有表加共享鎖,寫入時(shí)則對(duì)表加排它鎖。但在表有讀取操作的同時(shí),也可以往表中插入新的記錄,這被稱為并發(fā)插入。

MyISAM表可以手工或者自動(dòng)執(zhí)行檢查和修復(fù)操作。但是和事務(wù)恢復(fù)以及崩潰恢復(fù)不同,可能導(dǎo)致一些「數(shù)據(jù)丟失」,而且修復(fù)操作是非常慢的。

對(duì)于MyISAM表,即使是BLOB和TEXT等長(zhǎng)字段,也可以基于其前500個(gè)字符創(chuàng)建索引,MyISAM也支持「全文索引」,這是一種基于分詞創(chuàng)建的索引,可以支持復(fù)雜的查詢。

如果指定了DELAY_KEY_WRITE選項(xiàng),在每次修改執(zhí)行完成時(shí),不會(huì)立即將修改的索引數(shù)據(jù)寫入磁盤,而是會(huì)寫到內(nèi)存中的鍵緩沖區(qū),只有在清理鍵緩沖區(qū)或者關(guān)閉表的時(shí)候才會(huì)將對(duì)應(yīng)的索引塊寫入磁盤。這種方式可以極大的提升寫入性能,但是在數(shù)據(jù)庫(kù)或者主機(jī)崩潰時(shí)會(huì)造成「索引損壞」,需要執(zhí)行修復(fù)操作。

InnoDB與MyISAM對(duì)比

說了這么多估計(jì)看一眼也沒記住,給你一張表,簡(jiǎn)單羅列兩種引擎的主要區(qū)別,如下圖。

引擎對(duì)比

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯

其他存儲(chǔ)引擎

MySQL還支持其他一些存儲(chǔ)引擎,比如memory引擎、NDB集群引擎、CSV引擎,由于這些引擎沒有上述InnoDB 和MyISAM 常用,這里不作介紹,感興趣可以去翻MySQL文檔了解。這里同樣給出官方鏈接:https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

引擎列表

點(diǎn)擊添加圖片描述(最多60個(gè)字)編輯


點(diǎn)擊添加圖片描述(最多60個(gè)字)

再說兩句

這一篇是MySQL基礎(chǔ)篇,我力求用通俗易懂和圖表結(jié)合的形式給大家梳理這塊知識(shí),越是基礎(chǔ)和底層的知識(shí)越容易被考察掌握程度,以上知識(shí)點(diǎn)都可能成為面試中的一個(gè)考察點(diǎn),相信看完對(duì)MySQL事務(wù)和存儲(chǔ)引擎應(yīng)該有一個(gè)比較完整的理解。

最后,感謝各位的閱讀,文章的目的是分享對(duì)知識(shí)的理解,若文中出現(xiàn)明顯紕漏也歡迎指出,我們一起在探討中學(xué)習(xí)。

[我要糾錯(cuò)]
文:王振袢&發(fā)表于江蘇
關(guān)鍵詞: 學(xué)習(xí) 關(guān)系型 數(shù)據(jù)庫(kù) MySQL 好的

來源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。

點(diǎn)個(gè)贊
0
踩一腳
0

您在閱讀:面試官:你說對(duì) MySQL 事務(wù)很熟?那我問你 10 個(gè)問題

Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利

蘇公網(wǎng)安備32010402000125 蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司

南京思必達(dá)教育科技有限公司版權(quán)所有   百度統(tǒng)計(jì)

主站蜘蛛池模板: 国产成人精选免费视频 | 最近中文字幕2019 | 黄+色+性+人免费 | 欧美成人视 | 国产伦精品一区二区三区免 | 夜夜春精品视频 | 日韩毛片| 国产 欧美 在线 | 国产精品成人第一区 | 精品视频在线视频 | 亚洲第一成年免费网站 | 国产精选莉莉私人影院 | 一级做a爰性色毛片免费 | 中国黄色毛片视频 | 日韩avv | 久久综合欧美成人 | 国产小视频在线高清播放 | 国产制服丝袜在线观看 | 欧美大黄视频 | 就操在线| 韩国精品一区 | 精品国产成a人在线观看 | 日韩字幕一中文在线综合 | 黄色网址在线免费看 | 久久综合九色综合欧美狠狠 | 欧美一级看片a免费观看 | free性亚洲| 欧美日韩视频在线播放 | 欧美不卡在线 | 欧美激情在线精品三区 | 久操手机在线视频 | 老司机深夜影院入口aaaa | 亚洲九九九 | 一本大道久东京 | 最近中文字幕视频国语中文字幕 | 国产bbw| 欧美操片在线观看 | 亚久久伊人精品青青草原2020 | 久久亚洲国产精品一区二区 | 国产日韩欧美久久久 | 亚洲色大成网站www 亚洲色图天堂 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產(chǎn)品享最低成本,有需要聯(lián)系,
  • 卡爾蔡司鏡片優(yōu)惠店,鏡片價(jià)格低
  • 蘋果原裝手機(jī)殼