??作者簡(jiǎn)介:小明java問(wèn)道之路,2022年度博客之星全國(guó)TOP3,專(zhuān)注于后端、中間件、計(jì)算機(jī)底層、架構(gòu)設(shè)計(jì)演進(jìn)與穩(wěn)定性建設(shè)優(yōu)化,文章內(nèi)容兼具廣度、深度、大廠技術(shù)方案,對(duì)待技術(shù)喜歡推理加驗(yàn)證,就職于知名金融公司后端高級(jí)工程師。
? ? ? ??
?? 熱衷分享,喜歡原創(chuàng)~ 關(guān)注我會(huì)給你帶來(lái)一些不一樣的認(rèn)知和成長(zhǎng)。
? ? ? ??
?? 2022博客之星TOP3 | CSDN博客專(zhuān)家 | 后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 | CSDN內(nèi)容合伙人
?? InfoQ(極客邦)簽約作者、阿里云專(zhuān)家 | 簽約博主、51CTO專(zhuān)家 | TOP紅人、華為云享專(zhuān)家
????????
??如果此文還不錯(cuò)的話,還請(qǐng)??關(guān)注、點(diǎn)贊、收藏三連支持??一下博主~?
?? 文末獲取聯(lián)系 ???????? 精彩專(zhuān)欄推薦訂閱收藏 ????
專(zhuān)欄系列(點(diǎn)擊解鎖)
學(xué)習(xí)路線(點(diǎn)擊解鎖)
知識(shí)定位
??Redis從入門(mén)到精通與實(shí)戰(zhàn)??
Redis從入門(mén)到精通與實(shí)戰(zhàn)
圍繞原理源碼講解Redis面試知識(shí)點(diǎn)與實(shí)戰(zhàn)
??MySQL從入門(mén)到精通??
MySQL從入門(mén)到精通
全面講解MySQL知識(shí)與企業(yè)級(jí)MySQL實(shí)戰(zhàn) ??計(jì)算機(jī)底層原理??
深入理解計(jì)算機(jī)系統(tǒng)CSAPP
以深入理解計(jì)算機(jī)系統(tǒng)為基石,構(gòu)件計(jì)算機(jī)體系和計(jì)算機(jī)思維
Linux內(nèi)核源碼解析
圍繞Linux內(nèi)核講解計(jì)算機(jī)底層原理與并發(fā)
??數(shù)據(jù)結(jié)構(gòu)與企業(yè)題庫(kù)精講??
數(shù)據(jù)結(jié)構(gòu)與企業(yè)題庫(kù)精講
結(jié)合工作經(jīng)驗(yàn)深入淺出,適合各層次,筆試面試算法題精講
??互聯(lián)網(wǎng)架構(gòu)分析與實(shí)戰(zhàn)??
企業(yè)系統(tǒng)架構(gòu)分析實(shí)踐與落地
行業(yè)最前沿視角,專(zhuān)注于技術(shù)架構(gòu)升級(jí)路線、架構(gòu)實(shí)踐
互聯(lián)網(wǎng)企業(yè)防資損實(shí)踐
互聯(lián)網(wǎng)金融公司的防資損方法論、代碼與實(shí)踐
??Java全棧白寶書(shū)??
精通Java8與函數(shù)式編程
本專(zhuān)欄以實(shí)戰(zhàn)為基礎(chǔ),逐步深入Java8以及未來(lái)的編程模式
深入理解JVM
詳細(xì)介紹內(nèi)存區(qū)域、字節(jié)碼、方法底層,類(lèi)加載和GC等知識(shí)
深入理解高并發(fā)編程
深入Liunx內(nèi)核、匯編、C++全方位理解并發(fā)編程
Spring源碼分析
Spring核心七IOC/AOP等源碼分析
MyBatis源碼分析
MyBatis核心源碼分析
Java核心技術(shù)
只講Java核心技術(shù)
本文目錄
本文導(dǎo)讀
一、什么是Redo Log、什么是Undo Log
二、MySQL實(shí)現(xiàn)ACID的原理
1、原子性(Atomicity)
1.1、MySQL事務(wù)原子性的特性
1.2、事務(wù)原子性實(shí)現(xiàn)原理(Undo log)
2、一致性(Consistency)
2.1、MySQL事務(wù)一致性的特點(diǎn)
2.2、一致性(Consistency)的實(shí)現(xiàn)原理
3、隔離性(Isolation)
3.1、MySQL事務(wù)隔離性的特點(diǎn)
3.2、MySQL事務(wù)隔離性的實(shí)現(xiàn)原理(鎖、MVCC)
3.2.1、MySQL事務(wù)隔離性-鎖機(jī)制
3.2.2、MySQL事務(wù)隔離性-MVCC
3.3、MySQL鎖辨析
4、持久性(Durability)
4.1、MySQL事務(wù)持久性的特點(diǎn)
4.2、持久性的實(shí)現(xiàn)原理
4.3、Redo log為什么比直接修改Buffer Pool快
總結(jié)
本文導(dǎo)讀
本文是《MVCC詳解與MVCC實(shí)現(xiàn)原理》、《MySQL事務(wù)隔離機(jī)制與實(shí)現(xiàn)原理詳解》的后續(xù)內(nèi)容補(bǔ)充,如果不了解MySQL事務(wù)隔離機(jī)制、MVCC實(shí)現(xiàn)原理請(qǐng)先學(xué)習(xí)上述兩篇文章。
一、什么是Redo Log、什么是Undo Log
MySQL InnoDB提供了兩種類(lèi)型的事務(wù)日志,Redo Log(重做日志)和undo Log(回滾日志)。Redo Log會(huì)保存操作的正向日志,Undo Log則相反。
舉個(gè)例子,新增一條數(shù)據(jù)時(shí),Undo Log會(huì)新增一條insert SQL,而Undo Log則是生成一條delete where id =id 的SQL 日志,而修改時(shí),Redo Log記錄update SQL ,而Undo Log 則是修改內(nèi)容和條件相反。
簡(jiǎn)單理解為 Redo Log 是保存要去做的事情,Undo Log就是用來(lái)保存撤回之前完成的事情。
二、MySQL實(shí)現(xiàn)ACID的原理
1、原子性(Atomicity)
1.1、MySQL事務(wù)原子性的特性
事務(wù)是作為一個(gè)整體執(zhí)行的,其中包含的數(shù)據(jù)庫(kù)的所有SQL語(yǔ)句要么執(zhí)行,要么不執(zhí)行。
如果對(duì)于一個(gè)事務(wù)來(lái)說(shuō)其中的SQL語(yǔ)句執(zhí)行失敗,則已經(jīng)執(zhí)行的語(yǔ)句也必須回滾,數(shù)據(jù)庫(kù)退回到事務(wù)之前的狀態(tài)。
1.2、事務(wù)原子性實(shí)現(xiàn)原理(Undo log)
實(shí)現(xiàn)原子性的關(guān)鍵是當(dāng)事務(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;如果事務(wù)執(zhí)行失敗或調(diào)用了 rollback,導(dǎo)致事務(wù)需要回滾,便可以利用 Undo log 中的信息將數(shù)據(jù)回滾到修改之前的樣子。
Undo log 屬于邏輯日志,它記錄的是SQL執(zhí)行相關(guān)的信息。當(dāng)發(fā)生回滾時(shí),InnoDB 會(huì)根據(jù) Undo log 的內(nèi)容做與之前相反的工作:
對(duì)于每個(gè) insert,回滾時(shí)會(huì)執(zhí)行 delete;
對(duì)于每個(gè) delete,回滾時(shí)會(huì)執(zhí)行insert;
對(duì)于每個(gè) update,回滾時(shí)會(huì)執(zhí)行一個(gè)相反的 update,把數(shù)據(jù)改回去。
以u(píng)pdate操作為例:當(dāng)事務(wù)執(zhí)行update時(shí),其生成的Undo log中會(huì)包含被修改行的主鍵(以便知道修改了哪些行)、修改了哪些列、這些列在修改前后的值等信息,回滾時(shí)便可以使用這些信息將數(shù)據(jù)還原到update之前的狀態(tài)。
Undo log (回滾日志)是采用段(segment)的方式來(lái)記錄的,每個(gè)Undo操作在記錄的時(shí)候占用一個(gè)Undo log segment。
在數(shù)據(jù)更改操作時(shí),記錄了相對(duì)應(yīng)的Undo log的目的在于:
1、記錄事務(wù)發(fā)生之前的一個(gè)版本,用于回滾;
2、通過(guò)mvcc + Undo log實(shí)現(xiàn)Innodb事務(wù)可重復(fù)讀和讀已提交隔離級(jí)別。
2、一致性(Consistency)
2.1、MySQL事務(wù)一致性的特點(diǎn)
一致性是指事務(wù)執(zhí)行結(jié)束后,數(shù)據(jù)的完整性不能被破壞,業(yè)務(wù)的一致性不能被破壞,事務(wù)執(zhí)行的前后都是合法的數(shù)據(jù)狀態(tài)。
可以說(shuō),一致性是事務(wù)追求的最終目標(biāo),原子性、持久性和隔離性,如果這些特性無(wú)法保證,事務(wù)的一致性也無(wú)法保證。此外除了數(shù)據(jù)庫(kù)底層的保障,一致性的實(shí)現(xiàn)也需要應(yīng)用層的保障。
數(shù)據(jù)庫(kù)的完整性包括但是不限于:
實(shí)體完整性(如行的主鍵存在且唯一)、列完整性(如字段的類(lèi)型,大小,長(zhǎng)度符合要求),、外鍵約束(外鍵約束還存在)
業(yè)務(wù)的一致性(如轉(zhuǎn)賬前后,不管事務(wù)成功還是失敗,兩個(gè)賬戶(hù)的和應(yīng)該是不變的)
事務(wù)的一致性決定了一個(gè)系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)的復(fù)雜度,因?yàn)槭聞?wù)可以有不同程度的一致性:
1、強(qiáng)一致性:無(wú)論更新操作實(shí)在哪一個(gè)數(shù)據(jù)副本執(zhí)行,之后所有的讀操作都能獲得最新的數(shù)據(jù)。
2、弱一致性:提交的更新操作,不一定立即會(huì)被讀操作讀到,需要一段時(shí)間,此種情況會(huì)存在一個(gè)不一致窗口。?
3、最終一致性:事務(wù)更新一份數(shù)據(jù),最終一致性保證在沒(méi)有其他事務(wù)更新同樣的值的話,最終所有的事務(wù)都會(huì)讀到之前事務(wù)更新的最新值。如果沒(méi)有錯(cuò)誤發(fā)生,不一致窗口的大小依賴(lài)于:通信延遲,系統(tǒng)負(fù)載等。
2.2、一致性(Consistency)的實(shí)現(xiàn)原理
一致性是通過(guò)事務(wù)的原子性、持久性和隔離性來(lái)保證的,所以對(duì)于原子性、持久性、隔離性的實(shí)現(xiàn)原理會(huì)著重講解
3、隔離性(Isolation)
3.1、MySQL事務(wù)隔離性的特點(diǎn)
并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),一個(gè)事務(wù)不被其他事務(wù)所干擾,或者說(shuō)隔離性是事務(wù)所操作的數(shù)據(jù)在提交之前,對(duì)其他事務(wù)的可見(jiàn)程度。
在SQL 92標(biāo)準(zhǔn)定義了四個(gè)事務(wù)隔離級(jí)別:
讀未提交(RU,Read Uncommitted):允許事務(wù)在執(zhí)行過(guò)程中,讀取其他事務(wù)尚未提交的數(shù)據(jù);?
讀已提交(RC,Read Committed):一個(gè)事務(wù)提交之后,它做的變更才會(huì)被其他事務(wù)看到
可重復(fù)讀(RR,Repeatable Read):在同一個(gè)事務(wù)內(nèi),任意時(shí)刻的查詢(xún)結(jié)果都是一致的,無(wú)論是否有其他事務(wù)對(duì)這份數(shù)據(jù)進(jìn)行操作,以及這個(gè)事務(wù)是否提交。(InnoDB默認(rèn)級(jí)別)
串行化讀(serializable ):所有事務(wù)逐個(gè)依次執(zhí)行,每次讀都需要獲取表級(jí)共享鎖,讀寫(xiě)會(huì)相互阻塞。
并發(fā)并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)可能發(fā)生的問(wèn)題:
臟讀:臟讀是指在一個(gè)事務(wù)處理過(guò)程里讀取了另一個(gè)未提交的事務(wù)中的數(shù)據(jù)。
不可重復(fù)讀:不可重復(fù)讀是指在對(duì)于數(shù)據(jù)庫(kù)中的某個(gè)數(shù)據(jù),一個(gè)事務(wù)范圍內(nèi)多次查詢(xún)卻返回了不同的數(shù)據(jù)值,這是由于在查詢(xún)間隔,被另一個(gè)事務(wù)修改并提交了。
幻讀:幻讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,比如事務(wù)1對(duì)某個(gè)數(shù)據(jù)項(xiàng)做了從“1”修改為“2”的操作,事務(wù)2又插入了一行數(shù)據(jù)項(xiàng),而這個(gè)數(shù)據(jù)項(xiàng)的數(shù)值還是為“1”,操作事務(wù)1的用戶(hù)如果查看剛剛修改的數(shù)據(jù),會(huì)發(fā)現(xiàn)還有一行沒(méi)有修改。
不可重復(fù)讀和臟讀的區(qū)別是,臟讀是某一事務(wù)讀取了另一個(gè)事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)。
幻讀和不可重復(fù)讀的區(qū)別是,幻讀和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù)(這點(diǎn)就臟讀不同),所不同的是不可重復(fù)讀查詢(xún)的都是同一個(gè)數(shù)據(jù)項(xiàng),而幻讀針對(duì)的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個(gè)數(shù))。不可重復(fù)度則針對(duì)UPDATE,幻讀通常針對(duì)的是INSERT。
3.2、MySQL事務(wù)隔離性的實(shí)現(xiàn)原理(鎖、MVCC)
主要是運(yùn)用了鎖機(jī)制和操作日志和隱藏?cái)?shù)據(jù)列(mvcc)來(lái)實(shí)現(xiàn)的。
3.2.1、MySQL事務(wù)隔離性-鎖機(jī)制
MySQL鎖機(jī)制的基本工作原理就是:事務(wù)在修改數(shù)據(jù)庫(kù)之前,需要先獲得相應(yīng)的鎖,獲得鎖的事務(wù)才可以修改數(shù)據(jù);在該事務(wù)操作期間,這部分的數(shù)據(jù)是鎖定,其他事務(wù)如果需要修改數(shù)據(jù),需要等待當(dāng)前事務(wù)提交或回滾后釋放鎖。
在MySQL事務(wù)中,鎖的實(shí)現(xiàn)與隔離級(jí)別有關(guān)。
在RR(Repeatable Read)隔離級(jí)別下,MySQL使用間隙鎖(間隙鎖是innodb中行鎖的一種,使用間隙鎖鎖住的是一個(gè)區(qū)間,而不僅僅是這個(gè)區(qū)間中的每一條數(shù)據(jù))來(lái)防止以并行性為代價(jià)寫(xiě)入數(shù)據(jù),以解決幻讀的問(wèn)題。
排它鎖解決臟讀
共享鎖解決不可重復(fù)讀
3.2.2、MySQL事務(wù)隔離性-MVCC
MVCC是通過(guò)在每行記錄后面保存三個(gè)隱藏的列來(lái)實(shí)現(xiàn)的,一個(gè)保存了行的事務(wù)ID(每次提交事務(wù),事務(wù)ID會(huì)自增),一個(gè)保存了行的回滾段指針
事務(wù)開(kāi)始時(shí)刻會(huì)把該事務(wù)ID放到當(dāng)前事務(wù)影響的行事務(wù)ID字段中,而 DB_ROLL_PTR 指向該行回滾段的指針,該行記錄上的所有版本數(shù)據(jù),都在undo log回滾日志中通過(guò)鏈表形式組織,所以該值實(shí)際指向undo log中該行的歷史記錄鏈表。
在可重復(fù)讀(RR) 的隔離級(jí)別下,MVCC具體操作:
SELECT操作:InnoDB遵循以下兩個(gè)規(guī)則:只查找數(shù)據(jù)行的事務(wù)ID小于或等于當(dāng)前事務(wù)ID的版本,這樣可以確保事務(wù)讀取的行,要么是在事務(wù)開(kāi)始前已經(jīng)存在的,要么是事務(wù)自身插入或者修改過(guò)的記錄。行的刪除版本要未被定義,讀取到事務(wù)開(kāi)始之前狀態(tài)的版本,這可以確保事務(wù)讀取到的行,在事務(wù)開(kāi)始之前未被刪除。只有同時(shí)滿(mǎn)足的兩者的記錄,才能返回作為查詢(xún)結(jié)果。
INSERT:InnoDB為新插入的每一行保存當(dāng)前事務(wù)編號(hào)作為行版本號(hào)。
DELETE:InnoDB為刪除的每一行保存當(dāng)前事務(wù)編號(hào)作為行刪除標(biāo)識(shí)。
UPDATE:InnoDB為插入一行新記錄,保存當(dāng)前事務(wù)編號(hào)作為行版本號(hào),同時(shí)保存當(dāng)前事務(wù)編號(hào)到原來(lái)的行作為行刪除標(biāo)識(shí)。
在并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),對(duì)正在事務(wù)中的數(shù)據(jù)做MVCC多版本的管理,以避免寫(xiě)操作阻塞讀操作,并且可以通過(guò)比較版本解決幻讀。
MVCC只在 可重復(fù)度(RR) 和 讀已提交(RC) 兩個(gè)隔離級(jí)別下才會(huì)工作,其中,MVCC實(shí)質(zhì)就是通過(guò)保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)的。?
在RC(Read Commited )的隔離級(jí)別下,每次快照讀取都會(huì)生成并獲得最新的 readview。在RR(Repeatable Read)隔離級(jí)別,只有讀取同一事務(wù)的第一個(gè)快照才能創(chuàng)建 readview。每個(gè)后續(xù)快照讀取都使用相同的 readview,因此每個(gè)查詢(xún)結(jié)果都相同。
快照讀:不加鎖的 select 操作就是快照讀,即無(wú)鎖的非阻塞讀?。?/p>
當(dāng)前讀:select lock in share mode (共享鎖), select for update; update; insert; delete (排他鎖)這些操作都是一種當(dāng)前讀。讀取最新版本的記錄,讀取時(shí),它還確保其他并發(fā)事務(wù)無(wú)法修改當(dāng)前記錄,并鎖定讀取的記錄。
3.3、MySQL鎖辨析
InnoDB 實(shí)現(xiàn)了標(biāo)準(zhǔn)的行級(jí)鎖,包括兩種:共享鎖(簡(jiǎn)稱(chēng) s 鎖)、排它鎖(簡(jiǎn)稱(chēng) x 鎖)。
行鎖的實(shí)現(xiàn)依賴(lài)于索引,一旦某個(gè)加鎖操作沒(méi)有使用到索引,那么該鎖就會(huì)退化為表鎖。
記錄鎖存在于包括主鍵索引在內(nèi)的唯一索引中,鎖定單條索引記錄,記錄鎖也是排它(X)鎖,所以會(huì)阻塞其他事務(wù)對(duì)其插入、更新、刪除。記錄鎖是鎖住記錄,鎖住索引記錄,而不是真正的數(shù)據(jù)記錄。
間隙鎖存在于非唯一索引中,鎖定開(kāi)區(qū)間范圍內(nèi)的一段間隔,它是基于臨鍵鎖實(shí)現(xiàn)的。
臨鍵鎖(Next-Key Locks?是記錄鎖和間隙鎖的組合)于非唯一索引中,該類(lèi)型的每條記錄的索引上都存在這種鎖,它是一種特殊的間隙鎖,鎖一段左開(kāi)右閉的索引區(qū)間。
4、持久性(Durability)
4.1、MySQL事務(wù)持久性的特點(diǎn)
持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。
4.2、持久性的實(shí)現(xiàn)原理
持久性的實(shí)現(xiàn)關(guān)鍵在于Redo Log日志,在執(zhí)行SQL時(shí)會(huì)保存已執(zhí)行的SQL語(yǔ)句到一個(gè)指定的Log文件,當(dāng)執(zhí)行recovery時(shí)重新執(zhí)行Redo Log記錄的SQL操作。
當(dāng)向數(shù)據(jù)庫(kù)寫(xiě)入數(shù)據(jù)時(shí),執(zhí)行過(guò)程會(huì)首先寫(xiě)入Buffer Pool,Buffer Pool中修改的數(shù)據(jù)會(huì)定期刷新到磁盤(pán)中(這一過(guò)程叫做刷盤(pán)),這整一過(guò)程稱(chēng)為Redo Log。
Redo Log 分為:1、Buffer Pool內(nèi)存中的日志緩沖(Redo Log buffer),該部分日志是易失性的;2、磁盤(pán)上的重做日志文件(Redo Log file),該部分日志是持久的。
Buffer Pool的使用可以大大提高了讀寫(xiě)數(shù)據(jù)的效率,但是也帶了新的問(wèn)題:如果MySQL宕機(jī),而此時(shí)Buffer Pool中修改的數(shù)據(jù)在內(nèi)存還沒(méi)有刷新到磁盤(pán),就會(huì)導(dǎo)致數(shù)據(jù)的丟失,事務(wù)的持久性無(wú)法保證。
為了確保事務(wù)的持久性,Redo Log被引入來(lái)解決這個(gè)問(wèn)題:當(dāng)數(shù)據(jù)修改時(shí),除了修改Buffer Pool中的數(shù)據(jù),還會(huì)在Redo Log記錄這次操作;
當(dāng)事務(wù)提交時(shí),會(huì)調(diào)用fsync接口對(duì)Redo Log進(jìn)行刷盤(pán)。
如果MySQL宕機(jī),重啟時(shí)可以讀取Redo Log中的數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)。Redo Log采用的是WAL(Write-ahead Logging,預(yù)寫(xiě)式日志),所有修改先寫(xiě)入日志,再更新到Buffer Pool,保證了數(shù)據(jù)不會(huì)因MySQL宕機(jī)而丟失,從而滿(mǎn)足了持久性要求。
4.3、Redo log為什么比直接修改Buffer Pool快
既然Redo Log也需要在事務(wù)提交時(shí)將日志寫(xiě)入磁盤(pán),為什么它比直接將Buffer Pool中修改的數(shù)據(jù)寫(xiě)入磁盤(pán)(即刷臟)要快呢?
1、刷臟是隨機(jī)IO,因?yàn)槊看涡薷牡臄?shù)據(jù)位置隨機(jī),但寫(xiě)Redo Log是追加操作,屬于順序IO。
2、刷臟是以數(shù)據(jù)頁(yè)(Page)為單位的,MySQL默認(rèn)頁(yè)大小是16KB,一個(gè)Page上一個(gè)小修改都要整頁(yè)寫(xiě)入;而Redo Log中只包含真正需要寫(xiě)入的部分,無(wú)效IO大大減少。
4.4、RedoLog與BinLog辨析
在MySQL中還存在BinLog(二進(jìn)制日志)也可以記錄寫(xiě)操作并用于數(shù)據(jù)的恢復(fù),但二者是有著根本的不同的:
作用不同:Redo Log是用于crash recovery的,保證MySQL宕機(jī)也不會(huì)影響持久性;BinLog是用于point-in-time recovery的,保證服務(wù)器可以基于時(shí)間點(diǎn)恢復(fù)數(shù)據(jù),此外BinLog還用于主從復(fù)制
層次不同:Redo Log是InnoDB存儲(chǔ)引擎實(shí)現(xiàn)的,而B(niǎo)inLog是MySQL的服務(wù)器層(可以參考文章前面對(duì)MySQL邏輯架構(gòu)的介紹)實(shí)現(xiàn)的,同時(shí)支持InnoDB和其他存儲(chǔ)引擎
內(nèi)容不同:Redo Log是物理日志,內(nèi)容基于磁盤(pán)的Page;BinLog的內(nèi)容是二進(jìn)制的,根據(jù)BinLog_format參數(shù)的不同,可能基于sql語(yǔ)句、基于數(shù)據(jù)本身或者二者的混合
寫(xiě)入時(shí)機(jī)不同:BinLog在事務(wù)提交時(shí)寫(xiě)入,Redo Log的寫(xiě)入時(shí)機(jī)相對(duì)多元
總結(jié)
1、原子性是通過(guò)MySQL的Undo Log來(lái)實(shí)現(xiàn)的:當(dāng)事務(wù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改時(shí),InnoDB會(huì)生成對(duì)應(yīng)的undo log;如果事務(wù)執(zhí)行失敗或調(diào)用了rollback,導(dǎo)致事務(wù)需要回滾,便可以利用undo log中的信息將數(shù)據(jù)回滾到修改之前的樣子。
2、MySQL會(huì)通過(guò)mvcc + Undo Log實(shí)現(xiàn)Innodb事務(wù)可重復(fù)讀和讀已提交隔離級(jí)別。
3、Innodb事務(wù)的隔離級(jí)別是由鎖機(jī)制和MVVC(多版本并發(fā)控制)實(shí)現(xiàn)的
4、在執(zhí)行SQL時(shí)會(huì)保存已執(zhí)行的SQL語(yǔ)句到一個(gè)指定的Log文件,當(dāng)執(zhí)行recovery時(shí)重新執(zhí)行Redo Log記錄的SQL操作。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-714189.html
5、一致性是通過(guò)原子性、持久性和隔離性來(lái)保證的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-714189.html
到了這里,關(guān)于【MySQL】MySQL實(shí)現(xiàn)ACID的原理(MySQL專(zhuān)欄啟動(dòng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!