在之前好多章節(jié)中,已經(jīng)把語(yǔ)言類(lèi)和計(jì)算機(jī)網(wǎng)絡(luò)做了相關(guān)總結(jié),后面我會(huì)專(zhuān)門(mén)出一章來(lái)總結(jié)一下之前的筆記,給大家捋一捋到底該怎么去看這些文章。
雖然這會(huì)兒總結(jié)出來(lái)的都是很零散的知識(shí),可能看的時(shí)候沒(méi)有什么頭緒,也不知道從什么地方看起,但是你也可以去合集找找相關(guān)的專(zhuān)題,都很全,文章字?jǐn)?shù)可能有點(diǎn)多,學(xué)習(xí)的時(shí)候還是需要點(diǎn)耐心的哈。
作為后端開(kāi)發(fā)工程師,數(shù)據(jù)庫(kù)是怎么也繞不過(guò)去的一個(gè)坎,相信你們?cè)趯W(xué)校的時(shí)候也學(xué)過(guò)什么SQLserver或者其它數(shù)據(jù)庫(kù),最多的可能就是練習(xí)寫(xiě)寫(xiě)SQL語(yǔ)句類(lèi)的東西。
MySQL作為當(dāng)下最流行的關(guān)系型數(shù)據(jù)庫(kù)之一,也是面試中的“熱門(mén)”,面試官不僅會(huì)考察你對(duì)SQL語(yǔ)句的熟練程度,也會(huì)對(duì)它的一個(gè)底層原理做非常多的考察。只要你簡(jiǎn)歷上寫(xiě)就必問(wèn),要是沒(méi)寫(xiě),也會(huì)問(wèn)你會(huì)不會(huì)數(shù)據(jù)庫(kù)。所以你自己體會(huì)它的重要性。
今天這節(jié)內(nèi)容是對(duì)MySQL數(shù)據(jù)庫(kù)在面試過(guò)程中遇到的一些高頻問(wèn)題做一個(gè)總結(jié),可能你看完這篇文章就不需要專(zhuān)門(mén)去準(zhǔn)備數(shù)據(jù)庫(kù)相關(guān)的知識(shí)了。里面的內(nèi)容大多是我在面試過(guò)程中遇到的,大家都知道近兩年是非常非常卷的,一個(gè)崗位可能有無(wú)數(shù)個(gè)候選人在面試,如果你想脫穎而出,那么就需要非常強(qiáng)的基礎(chǔ)作為你的踏板。OK,不浪費(fèi)時(shí)間說(shuō)這么多了,大家認(rèn)真看吧。
一、數(shù)據(jù)庫(kù)基礎(chǔ)
1、數(shù)據(jù)庫(kù)索引為什么要B+樹(shù)
數(shù)據(jù)庫(kù)的索引是使用B+樹(shù)來(lái)實(shí)現(xiàn)的。
那為什么要用B+樹(shù),為什么不用紅黑樹(shù)和B樹(shù)?
B+樹(shù)是一種特殊的平衡多路樹(shù),是B樹(shù)的優(yōu)化改進(jìn)版本,它把所有的數(shù)據(jù)都存放在葉節(jié)點(diǎn)上,中間節(jié)點(diǎn)保存的是索引。這樣一來(lái)相對(duì)于B樹(shù)來(lái)說(shuō),減少了數(shù)據(jù)對(duì)中間節(jié)點(diǎn)的空間占用,使得中間節(jié)點(diǎn)可以存放更多的指針,使得樹(shù)變得更矮,深度更小,從而減少查詢的磁盤(pán)IO次數(shù),提高查詢效率。另一個(gè)是由于葉節(jié)點(diǎn)之間有指針連接,所以可以進(jìn)行范圍查詢,方便區(qū)間訪問(wèn)。
而紅黑樹(shù)是二叉的,它的深度相對(duì)B+樹(shù)來(lái)說(shuō)更大,更大的深度意味著查找次數(shù)更多,更頻繁的磁盤(pán)IO,所以紅黑樹(shù)更適合在內(nèi)存中進(jìn)行查找。
B+樹(shù)更適合操作系統(tǒng)文件索引和數(shù)據(jù)索引的原因:
- B+樹(shù)磁盤(pán)讀寫(xiě)代價(jià)更低,B+樹(shù)的內(nèi)部節(jié)點(diǎn)沒(méi)有指向關(guān)鍵字具體信息的指針。因此內(nèi)部節(jié)點(diǎn)相對(duì)于B-樹(shù)更小,如果把所有同一內(nèi)部節(jié)點(diǎn)的關(guān)鍵字放入同一塊磁盤(pán)當(dāng)中。盤(pán)所能容納的關(guān)鍵字?jǐn)?shù)量也就更多。一次性讀入內(nèi)存中需要查找的關(guān)鍵字也就越多,相對(duì)的IO讀寫(xiě)次數(shù)就有所降低。
- B+樹(shù)查詢效率更加穩(wěn)定。由于非終結(jié)點(diǎn)并不是最終指向文件內(nèi)容的節(jié)點(diǎn),而只是葉子節(jié)點(diǎn)中關(guān)鍵字的索引。所以任何關(guān)鍵字的查找必須走一條從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑。所有的關(guān)鍵字查詢路徑長(zhǎng)度都是相同的,導(dǎo)致了每一個(gè)數(shù)據(jù)查詢的效率相當(dāng)。
2、MYSQL的引擎對(duì)比
2.1、MySQL引擎
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或者內(nèi)存)中。這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過(guò)選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善你的應(yīng)用的整體功能。
數(shù)據(jù)庫(kù)引擎是用于存儲(chǔ)、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。利用數(shù)據(jù)庫(kù)引擎可控制訪問(wèn)權(quán)限并快速處理事務(wù),從而滿足企業(yè)內(nèi)大多數(shù)需要處理大量數(shù)據(jù)的應(yīng)用程序的要求。使用數(shù)據(jù)庫(kù)引擎創(chuàng)建用于聯(lián)機(jī)事務(wù)處理或聯(lián)機(jī)分析處理數(shù)據(jù)的關(guān)系數(shù)據(jù)庫(kù)。這包括創(chuàng)建用于存儲(chǔ)數(shù)據(jù)的表和用于查看、管理和保護(hù)數(shù)據(jù)安全的數(shù)據(jù)庫(kù)對(duì)象(如索引、視圖和存儲(chǔ)過(guò)程)。
MySQL存儲(chǔ)引擎主要有:MyIsam、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archive、Federated、Mrg_Myisam。
但是最常用的是InnoDB和Mylsam。
2.2、InnoDB
InnoDB是一個(gè)事務(wù)型的存儲(chǔ)引擎,有行級(jí)鎖定和外鍵約束。
Innodb引擎提供了對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持,并且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級(jí)別,關(guān)于數(shù)據(jù)庫(kù)事務(wù)與其隔離級(jí)別的內(nèi)容請(qǐng)見(jiàn)數(shù)據(jù)庫(kù)事務(wù)與其隔離級(jí)別這類(lèi)型的文章。該引擎還提供了行級(jí)鎖和外鍵約束,它的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫(kù)系統(tǒng),它本身其實(shí)就是基于MySQL后臺(tái)的完整數(shù)據(jù)庫(kù)系統(tǒng),MySQL運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是該引擎不支持FULLTEXT類(lèi)型的索引,而且它沒(méi)有保存表的行數(shù),當(dāng)SELECT COUNT(*) FROM TABLE時(shí)需要掃描全表。當(dāng)需要使用數(shù)據(jù)
庫(kù)事務(wù)時(shí),該引擎當(dāng)然是首選。由于鎖的粒度更小,寫(xiě)操作不會(huì)鎖定全表,所以在并發(fā)較高時(shí),使用Innodb引擎會(huì)提升效率。但是使用行級(jí)鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表。
適用場(chǎng)景:
- 經(jīng)常更新的表,適合處理多重并發(fā)的更新請(qǐng)求。
- 支持事務(wù)。
- 可以從災(zāi)難中恢復(fù)(通過(guò)bin-log日志等)。
- 外鍵約束。只有他支持外鍵。
- 支持自動(dòng)增加列屬性auto_increment。
索引結(jié)構(gòu):
- InnoDB也是B+Treee索引結(jié)構(gòu)。Innodb的索引文件本身就是數(shù)據(jù)文件,即B+Tree的數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù),這種索引就是聚集索引。這個(gè)索引的key就是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。
- InnoDB的輔助索引數(shù)據(jù)域存儲(chǔ)的也是相應(yīng)記錄主鍵的值而不是地址,所以當(dāng)以輔助索引查找時(shí),會(huì)先根據(jù)輔助索引找到主鍵,再根據(jù)主鍵索引找到實(shí)際的數(shù)據(jù)。所以innodb不建議使用過(guò)長(zhǎng)的主鍵,否則會(huì)使輔助索引變得過(guò)大。建議使用自增的字段作為主鍵,這樣B+Tree的每一個(gè)結(jié)點(diǎn)都會(huì)被順序的填滿,而不會(huì)頻繁的分裂調(diào)整,會(huì)有效的提升插入數(shù)據(jù)的效率。
2.3、Mylsam
MyIASM是MySQL默認(rèn)的引擎,但是它沒(méi)有提供對(duì)數(shù)據(jù)庫(kù)事務(wù)的支持,也不支持行級(jí)鎖和外鍵,因此當(dāng)INSERT或UPDATE數(shù)據(jù)時(shí)即寫(xiě)操作需要鎖定整個(gè)表,效率便會(huì)低一些。MyIsam 存儲(chǔ)引擎獨(dú)立于操作系統(tǒng),也就是可以在windows上使用,也可以比較簡(jiǎn)單的將數(shù)據(jù)轉(zhuǎn)移到linux操作系統(tǒng)上去。
適用場(chǎng)景:
- 不支持事務(wù)的設(shè)計(jì),但是并不代表著有事務(wù)操作的項(xiàng)目不能用MyIsam存儲(chǔ)引擎,可以在service層進(jìn)行根據(jù)自己的業(yè)務(wù)需求進(jìn)行相應(yīng)的控制。
- 不支持外鍵的表設(shè)計(jì)。
- 查詢速度很快,如果數(shù)據(jù)庫(kù)insert和update的操作比較多的話比較適用。
- 整天對(duì)表進(jìn)行加鎖的場(chǎng)景。
- MyISAM極度強(qiáng)調(diào)快速讀取操作。
- MyIASM中存儲(chǔ)了表的行數(shù),于是SELECT COUNT(*) FROM TABLE時(shí)只需要直接讀取已經(jīng)保存好的值而不需要進(jìn)行全表掃描。如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作且不需要數(shù)據(jù)庫(kù)事務(wù)的支持,那么MyIASM也是很好的選擇。
缺點(diǎn):就是不能在表?yè)p壞后主動(dòng)恢復(fù)數(shù)據(jù)。
索引結(jié)構(gòu):
MyISAM索引結(jié)構(gòu):MyISAM索引用的B+ tree來(lái)儲(chǔ)存數(shù)據(jù),MyISAM索引的指針指向的是鍵值的地址,地址存儲(chǔ)的是數(shù)據(jù)。B+Tree的數(shù)據(jù)域存儲(chǔ)的內(nèi)容為實(shí)際數(shù)據(jù)的地址,也就是說(shuō)它的索引和實(shí)際的數(shù)據(jù)是分開(kāi)的,只不過(guò)是用索引指向了實(shí)際的數(shù)據(jù),這種索引就是所謂的非聚集索引。
2.4、InnoDB和Mylsam的區(qū)別:
-
事務(wù):MyISAM類(lèi)型不支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持,提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。
-
性能:MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快。
-
行數(shù)保存:InnoDB 中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count() fromtable時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count()語(yǔ)句包含where條件時(shí),兩種表的操作是一樣的。
-
索引存儲(chǔ):對(duì)于AUTO_INCREMENT類(lèi)型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。MyISAM支持全文索引(FULLTEXT)、壓縮索引,InnoDB不支持。
MyISAM的索引和數(shù)據(jù)是分開(kāi)的,并且索引是有壓縮的,內(nèi)存使用率就對(duì)應(yīng)提高了不少。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的,沒(méi)有使用壓縮從而會(huì)造成Innodb比MyISAM體積龐大不小。
InnoDB存儲(chǔ)引擎被完全與MySQL服務(wù)器整合,InnoDB存儲(chǔ)引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。InnoDB存儲(chǔ)它的表&索引在一個(gè)表空間中,表空間可以包含數(shù)個(gè)文件(或原始磁盤(pán)分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個(gè)表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上。 -
服務(wù)器數(shù)據(jù)備份:InnoDB必須導(dǎo)出SQL來(lái)備份,LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用。
MyISAM應(yīng)對(duì)錯(cuò)誤編碼導(dǎo)致的數(shù)據(jù)恢復(fù)速度快。MyISAM的數(shù)據(jù)是以文件的形式存儲(chǔ),所以在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中會(huì)很方便。在備份和恢復(fù)時(shí)可單獨(dú)針對(duì)某個(gè)表進(jìn)行操作。
InnoDB是拷貝數(shù)據(jù)文件、備份 binlog,或者用 mysqldump,在數(shù)據(jù)量達(dá)到幾十G的時(shí)候就相對(duì)痛苦了。 -
鎖的支持:MyISAM只支持表鎖。InnoDB支持表鎖、行鎖。行鎖大幅度提高了多用戶并發(fā)操作的能力。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的。
3、MySQL的MVCC機(jī)制
MVCC是一種多版本并發(fā)控制機(jī)制,是MySQL的InnoDB存儲(chǔ)引擎實(shí)現(xiàn)隔離級(jí)別的一種具體方式,用于實(shí)現(xiàn)提交讀和可重復(fù)讀這兩種隔離級(jí)別。MVCC是通過(guò)保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)該機(jī)制,其在每行記錄后面保存兩個(gè)隱藏的列,分別保存這個(gè)行的創(chuàng)建版本號(hào)和刪除版本號(hào),然后Innodb的MVCC使用到的快照存儲(chǔ)在Undo日志中,該日志通過(guò)回滾指針把一個(gè)數(shù)據(jù)行所有快照連接起來(lái)。
4、事務(wù)
事務(wù)(Transaction)是由一系列對(duì)系統(tǒng)中數(shù)據(jù)進(jìn)行訪問(wèn)與更新的操作所組成的一個(gè)程序執(zhí)行邏輯單元。事務(wù)是DBMS中最基礎(chǔ)的單位,事務(wù)不可分割。
事務(wù)具有4個(gè)基本特征,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Duration),簡(jiǎn)稱(chēng)ACID。
- 原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫(kù),如果操作失敗則不能對(duì)數(shù)據(jù)庫(kù)有任何影響。
- 一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說(shuō)一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
拿轉(zhuǎn)賬來(lái)說(shuō),假設(shè)用戶A和用戶B兩者的錢(qián)加起來(lái)一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢(qián)相加起來(lái)應(yīng)該還得是5000,這就是事務(wù)的一致性。
- 隔離性(Isolation)
隔離性是當(dāng)多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
即要達(dá)到這么一種效果:對(duì)于任意兩個(gè)并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來(lái),T2要么在T1開(kāi)始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開(kāi)始,這樣每個(gè)事務(wù)都感覺(jué)不到有其他事務(wù)在并發(fā)地執(zhí)行。
多個(gè)事務(wù)并發(fā)訪問(wèn)時(shí),事務(wù)之間是隔離的,一個(gè)事務(wù)不應(yīng)該影響其它事務(wù)運(yùn)行效果。這指的是在并發(fā)環(huán)境中,當(dāng)不同的事務(wù)同時(shí)操縱相同的數(shù)據(jù)時(shí),每個(gè)事務(wù)都有各自的完整數(shù)據(jù)空間。由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離。
不同的隔離級(jí)別:
- Read Uncommitted(讀取未提交[添加中文釋義]內(nèi)容):最低的隔離級(jí)別,什么都不需要做,一個(gè)事務(wù)可以讀到另一個(gè)事務(wù)未提交的結(jié)果。所有的并發(fā)事務(wù)問(wèn)題都會(huì)發(fā)生。
- Read Committed(讀取提交內(nèi)容):只有在事務(wù)提交后,其更新結(jié)果才會(huì)被其他事務(wù)看見(jiàn)。可以解決臟讀問(wèn)題。
- Repeated Read(可重復(fù)讀):在一個(gè)事務(wù)中,對(duì)于同一份數(shù)據(jù)的讀取結(jié)果總是相同的,無(wú)論是否有其他事務(wù)對(duì)這份數(shù)據(jù)進(jìn)行操作,以及這個(gè)事務(wù)是否提交??梢越鉀Q臟讀、不可重復(fù)讀。
- Serialization(可串行化):事務(wù)串行化執(zhí)行,隔離級(jí)別最高,犧牲了系統(tǒng)的并發(fā)性??梢越鉀Q并發(fā)事務(wù)的所有問(wèn)題。
- 持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。
例如我們?cè)谑褂肑DBC操作數(shù)據(jù)庫(kù)時(shí),在提交事務(wù)方法后,提示用戶事務(wù)操作完成,當(dāng)我們程序執(zhí)行完成直到看到提示后,就可以認(rèn)定事務(wù)以及正確提交,即使這時(shí)候數(shù)據(jù)庫(kù)出現(xiàn)了問(wèn)題,也必須要將我們的事務(wù)完全執(zhí)行完成,否則就會(huì)造成我們看到提示事務(wù)處理完畢,但是數(shù)據(jù)庫(kù)因?yàn)楣收隙鴽](méi)有執(zhí)行事務(wù)的重大錯(cuò)誤。
5、數(shù)據(jù)庫(kù)的三大范式
- 第一范式:當(dāng)關(guān)系模式R的所有屬性都不能再分解為更基本的數(shù)據(jù)單位時(shí),稱(chēng)R是滿足第一范式,即屬性不可分。
- 第二范式:如果關(guān)系模式R滿足第一范式,并且R得所有非主屬性都完全依賴于R的每一個(gè)候選關(guān)鍵屬性,稱(chēng)R滿足第二范式。
- 第三范式:設(shè)R是一個(gè)滿足第一范式條件的關(guān)系模式,X是R的任意屬性集,如果X非傳遞依賴于R的任意一個(gè)候選關(guān)鍵字,稱(chēng)R滿足第三范式,即非主屬性不傳遞依賴于鍵碼。
6、數(shù)據(jù)庫(kù)的四種隔離級(jí)別
數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別有4個(gè),由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個(gè)級(jí)別可以逐個(gè)解決臟讀、不可重復(fù)讀、幻讀這幾類(lèi)問(wèn)題。
- ISOLATION_READ_UNCOMMITTED:這是事務(wù)最低的隔離級(jí)別,它充許令外一個(gè)事務(wù)可以看到這 個(gè)事務(wù)未提交的數(shù)據(jù)。這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。
- ISOLATION_READ_COMMITTED:保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取。另外 一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)
- ISOLATION_REPEATABLE_READ:這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻 像讀。它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重 復(fù)讀)。
- ISOLATION_SERIALIZABLE:這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí) 行。除了防止臟讀,不可重復(fù)讀外,還避免了幻像讀。
第1級(jí)別:Read Uncommitted(讀取未提交內(nèi)容)
(1)所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。
(2)本隔離級(jí)別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少。
(3)該級(jí)別引發(fā)的問(wèn)題是——臟讀(Dirty Read):讀取到了未提交的數(shù)據(jù)。
第2級(jí)別:Read Committed(讀取提交內(nèi)容)
(1)這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)。
(2)它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見(jiàn)已經(jīng)提交事務(wù)所做的改變。
(3)這種隔離級(jí)別出現(xiàn)的問(wèn)題是——不可重復(fù)讀(Nonrepeatable Read):不可重復(fù)讀意味著我們?cè)谕粋€(gè)事務(wù)中執(zhí)行完全相同的select語(yǔ)句時(shí)可能看到不一樣的結(jié)果。
導(dǎo)致這種情況的原因可能有:
- 有一個(gè)交叉的事務(wù)有新的commit,導(dǎo)致了數(shù)據(jù)的改變;
- 一個(gè)數(shù)據(jù)庫(kù)被多個(gè)實(shí)例操作時(shí),同一事務(wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit。
第3級(jí)別:Repeatable Read(可重讀)
(1)這是MySQL的默認(rèn)事務(wù)隔離級(jí)別。
(2)它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行。
(3)此級(jí)別可能出現(xiàn)的問(wèn)題——幻讀(Phantom Read):當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),會(huì)發(fā)現(xiàn)有新的“幻影” 行。
(4)InnoDB和Falcon存儲(chǔ)引擎通過(guò)多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問(wèn)題。
第4級(jí)別:Serializable(可串行化)
(1)這是最高的隔離級(jí)別。
(2)它通過(guò)強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問(wèn)題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。
(3)在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)。
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3929瀏覽量
66304 -
計(jì)算機(jī)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
3文章
342瀏覽量
22791 -
MySQL
+關(guān)注
關(guān)注
1文章
861瀏覽量
27968
發(fā)布評(píng)論請(qǐng)先 登錄
數(shù)據(jù)庫(kù)教程之PHP訪問(wèn)MySQL數(shù)據(jù)庫(kù)的理論知識(shí)詳細(xì)說(shuō)明
MySQL數(shù)據(jù)庫(kù)如何安裝和使用說(shuō)明
干貨:38個(gè)MySQL數(shù)據(jù)庫(kù)的必備知識(shí)和小技巧
華為云數(shù)據(jù)庫(kù)-RDS for MySQL數(shù)據(jù)庫(kù)
最全的數(shù)據(jù)庫(kù)-MySQL知識(shí)匯總2
最全的數(shù)據(jù)庫(kù)-MySQL知識(shí)匯總3
最全的數(shù)據(jù)庫(kù)-MySQL知識(shí)匯總4
MySQL數(shù)據(jù)庫(kù)管理與應(yīng)用
MySQL數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)
mysql數(shù)據(jù)庫(kù)基礎(chǔ)命令
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—MYSQL數(shù)據(jù)庫(kù)ibdata1文件損壞的數(shù)據(jù)恢復(fù)案例
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—Mysql數(shù)據(jù)庫(kù)表記錄丟失的數(shù)據(jù)恢復(fù)流程

MySQL數(shù)據(jù)庫(kù)的安裝

評(píng)論