国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MySQL】MySQL實(shí)現(xiàn)ACID的原理(MySQL專(zhuān)欄啟動(dòng))

這篇具有很好參考價(jià)值的文章主要介紹了【MySQL】MySQL實(shí)現(xiàn)ACID的原理(MySQL專(zhuān)欄啟動(dòng))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【MySQL】MySQL實(shí)現(xiàn)ACID的原理(MySQL專(zhuān)欄啟動(dòng)),《MySQL從入門(mén)到精通與實(shí)戰(zhàn)》,mysql,數(shù)據(jù)庫(kù),事務(wù),隔離性,原子性,持久性,一致性,原力計(jì)劃

??作者簡(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ì)相互阻塞。

【MySQL】MySQL實(shí)現(xiàn)ACID的原理(MySQL專(zhuān)欄啟動(dòng)),《MySQL從入門(mén)到精通與實(shí)戰(zhàn)》,mysql,數(shù)據(jù)庫(kù),事務(wù),隔離性,原子性,持久性,一致性,原力計(jì)劃

并發(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è)保存了行的回滾段指針

【MySQL】MySQL實(shí)現(xiàn)ACID的原理(MySQL專(zhuān)欄啟動(dòng)),《MySQL從入門(mén)到精通與實(shí)戰(zhàn)》,mysql,數(shù)據(jù)庫(kù),事務(wù),隔離性,原子性,持久性,一致性,原力計(jì)劃

事務(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操作。

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)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【MySQL】高性能高可用表設(shè)計(jì)實(shí)戰(zhàn)-表設(shè)計(jì)篇(MySQL專(zhuān)欄啟動(dòng))

    【MySQL】高性能高可用表設(shè)計(jì)實(shí)戰(zhàn)-表設(shè)計(jì)篇(MySQL專(zhuān)欄啟動(dòng))

    ??作者簡(jiǎn)介: 小明java問(wèn)道之路,專(zhuān)注于研究 Java/ Liunx內(nèi)核/ C++及匯編/計(jì)算機(jī)底層原理/源碼,就職于大型金融公司后端高級(jí)工程師,擅長(zhǎng)交易領(lǐng)域的高安全/可用/并發(fā)/性能的架構(gòu)設(shè)計(jì)與演進(jìn)、系統(tǒng)優(yōu)化與穩(wěn)定性建設(shè)。 ? ?? 熱衷分享,喜歡原創(chuàng)~ 關(guān)注我會(huì)給你帶來(lái)一些不一樣

    2024年02月11日
    瀏覽(22)
  • 滴滴滴,請(qǐng)看MYSQL事務(wù)的四大特征(ACID)的實(shí)現(xiàn)原理:曉其原理而通其實(shí)現(xiàn)。

    滴滴滴,請(qǐng)看MYSQL事務(wù)的四大特征(ACID)的實(shí)現(xiàn)原理:曉其原理而通其實(shí)現(xiàn)。

    一.什么是事務(wù)的四特征 原子性(Atomicity,或稱(chēng)不可分割性) 一致性(Consistency) 隔離性(Isolation) 持久性(Durability) 接下來(lái),我們將對(duì)四大特性的具體概念以及其底層實(shí)現(xiàn)原理來(lái)進(jìn)行剖析: 在講述具體的四大特性之前,我們先補(bǔ)充一點(diǎn)前置知識(shí) : 1.邏輯架構(gòu)和存儲(chǔ)引擎

    2023年04月25日
    瀏覽(29)
  • ROS從入門(mén)到精通10-1:項(xiàng)目實(shí)戰(zhàn)之智能跟隨機(jī)器人原理與實(shí)現(xiàn)

    ROS從入門(mén)到精通10-1:項(xiàng)目實(shí)戰(zhàn)之智能跟隨機(jī)器人原理與實(shí)現(xiàn)

    本專(zhuān)欄旨在通過(guò)對(duì)ROS的系統(tǒng)學(xué)習(xí),掌握ROS底層基本分布式原理,并具有機(jī)器人建模和應(yīng)用ROS進(jìn)行實(shí)際項(xiàng)目的開(kāi)發(fā)和調(diào)試的工程能力。 ??詳情:《ROS從入門(mén)到精通》 機(jī)器人是傳感器網(wǎng)絡(luò)、通信、人工智能、分布式計(jì)算、自動(dòng)化等多種技術(shù)的集大成者, 機(jī)器人技術(shù)的發(fā)展水平標(biāo)

    2024年02月07日
    瀏覽(24)
  • 《AI繪畫(huà)從入門(mén)到精通》專(zhuān)欄總目錄

    ?? 專(zhuān)欄名稱(chēng):《AI繪畫(huà)從入門(mén)到精通》 ?? 內(nèi)容介紹:Stable Diffusion 基礎(chǔ)教程、ControlNet 控制網(wǎng)絡(luò)、Stable Diffusion 綜合案例、Stable Diffusion 模型下載、模型訓(xùn)練、Stable Diffusion 解決方案等,適合零基礎(chǔ)和進(jìn)階的同學(xué)。 ?? 訂閱專(zhuān)欄:訂閱后可閱讀專(zhuān)欄內(nèi)所有文章,專(zhuān)欄持續(xù)更新

    2024年02月20日
    瀏覽(17)
  • 精通AI領(lǐng)域技術(shù)實(shí)戰(zhàn)千例專(zhuān)欄—學(xué)習(xí)人工智能的指南寶典

    精通AI領(lǐng)域技術(shù)實(shí)戰(zhàn)千例專(zhuān)欄—學(xué)習(xí)人工智能的指南寶典

    PC端可直接搜索 快捷鍵: Ctrl+F 應(yīng)用領(lǐng)域、項(xiàng)目、比賽名稱(chēng)、技術(shù)類(lèi)型等等 注意看本文目錄-快速了解本專(zhuān)欄 ?????? 你的技術(shù)旅程將在這里啟航! ?? 本專(zhuān)欄:精通AI領(lǐng)域技術(shù)實(shí)戰(zhàn)千例專(zhuān)欄 從基礎(chǔ)到實(shí)踐,深入學(xué)習(xí)。無(wú)論你是初學(xué)者還是經(jīng)

    2024年02月05日
    瀏覽(25)
  • Jmeter(七) - 從入門(mén)到精通 - 建立數(shù)據(jù)庫(kù)測(cè)試計(jì)劃實(shí)戰(zhàn)<MySQL數(shù)據(jù)庫(kù)>(詳解教程)

    Jmeter(七) - 從入門(mén)到精通 - 建立數(shù)據(jù)庫(kù)測(cè)試計(jì)劃實(shí)戰(zhàn)<MySQL數(shù)據(jù)庫(kù)>(詳解教程)

    1.簡(jiǎn)介 ? 在實(shí)際工作中,我們經(jīng)常會(huì)聽(tīng)到數(shù)據(jù)庫(kù)的性能和穩(wěn)定性等等,這些有時(shí)候也需要測(cè)試工程師去評(píng)估和測(cè)試,上一篇文章主要介紹了jmeter連接和創(chuàng)建數(shù)據(jù)庫(kù)測(cè)試計(jì)劃的過(guò)程,在文中通過(guò)示例和代碼非常詳細(xì)地介紹給大家,希望對(duì)各位小伙伴和童鞋們的學(xué)習(xí)或者工作具有一

    2024年02月13日
    瀏覽(41)
  • video-從入門(mén)到精通-不管任何項(xiàng)目奇葩需求,這一專(zhuān)欄就夠了

    video-從入門(mén)到精通-不管任何項(xiàng)目奇葩需求,這一專(zhuān)欄就夠了

    在日常我們的開(kāi)發(fā)中,我們會(huì)遇到類(lèi)似這樣的功能,視頻播放了這種情況,但是如果只是簡(jiǎn)單的實(shí)現(xiàn)的話, ui不滿(mǎn)意,因?yàn)?,別人有的,就是代表這是能實(shí)現(xiàn)的,你必須完成(苦der程序員) 為了解決這種苦惱,這篇專(zhuān)欄就夠用了, 博主加急更新中?。。。。。。?大佬如有見(jiàn)解

    2024年02月11日
    瀏覽(20)
  • 【mysql性能調(diào)優(yōu) ? 二】mysql的啟動(dòng)關(guān)閉原理和實(shí)戰(zhàn),及常見(jiàn)的錯(cuò)誤排查

    【mysql性能調(diào)優(yōu) ? 二】mysql的啟動(dòng)關(guān)閉原理和實(shí)戰(zhàn),及常見(jiàn)的錯(cuò)誤排查

    前言 MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。本文章收錄在MySQL性能優(yōu)化+原理+實(shí)戰(zhàn)

    2023年04月15日
    瀏覽(23)
  • 【MySQL】InnoDB和MyISAM區(qū)別詳解(MySQL專(zhuān)欄啟動(dòng))

    【MySQL】InnoDB和MyISAM區(qū)別詳解(MySQL專(zhuān)欄啟動(dòng))

    ??作者簡(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í)工程師。 ? ? ? ?? ?? 熱衷分享,喜歡原

    2024年02月03日
    瀏覽(20)
  • 【數(shù)據(jù)挖掘從入門(mén)到實(shí)戰(zhàn)】——專(zhuān)欄導(dǎo)讀

    【數(shù)據(jù)挖掘從入門(mén)到實(shí)戰(zhàn)】——專(zhuān)欄導(dǎo)讀

    目錄 1、專(zhuān)欄大綱 ??基礎(chǔ)部分 ??實(shí)戰(zhàn)部分 ??競(jìng)賽部分 2、代碼附錄 數(shù)據(jù)挖掘?qū)?,包含基本?數(shù)據(jù)挖掘算法分析和實(shí)戰(zhàn),數(shù)據(jù)挖掘競(jìng)賽干貨分享 等。數(shù)據(jù)挖掘是從大規(guī)模數(shù)據(jù)集中發(fā)現(xiàn)隱藏模式、關(guān)聯(lián)和知識(shí)的過(guò)程。它結(jié)合了統(tǒng)計(jì)學(xué)、人工智能和數(shù)據(jù)庫(kù)系統(tǒng)等領(lǐng)域的技術(shù)和

    2024年02月13日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包