溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL的兩階段提交機制是什么

發(fā)布時間:2023-02-02 14:32:14 來源:億速云 閱讀:108 作者:iii 欄目:MySQL數(shù)據(jù)庫

本文小編為大家詳細介紹“MySQL的兩階段提交機制是什么”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當(dāng),希望這篇“MySQL的兩階段提交機制是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

MySQL通過兩階段提交的機制,保證了redo log和bin log的邏輯一致性,進而保證了數(shù)據(jù)的不丟失以及主從庫的數(shù)據(jù)一致。

而說起兩階段提交,就不得不先介紹一下redo log和bin log。

redo log

redo log即重做日志,是InnoDB引擎特有的一種日志(有的面試官經(jīng)常問到這一點)。

redo log主要做什么呢?

以更新數(shù)據(jù)為例,我們知道,MySQL的數(shù)據(jù)是存儲在磁盤上的,如果每一次更新數(shù)據(jù),都去磁盤尋址找到要更新的數(shù)據(jù),進行更新操作的話,這個IO成本是非常高的。

如果是固態(tài)硬盤還好,如果是機械硬盤,那么MySQL的更新性能根本無法滿足我們的業(yè)務(wù)需要。

所以,MySQL采用了一種叫做WAL的技術(shù),Write-Ahead Logging。

當(dāng)更新數(shù)據(jù)時,將更新操作(即某個數(shù)據(jù)頁上做了什么修改)先寫到redo log里面,然后更新內(nèi)存,這個更新操作就算完成了。MySQL會在服務(wù)器空閑的時候,把redo log的操作記錄刷新到磁盤里,以保持?jǐn)?shù)據(jù)的一致性。

需要注意的是,redo log雖然也是磁盤上的一個文件,但是由于操作是順序?qū)?,所以性能是非常高的?/strong>

當(dāng)然了,redo log也是有大小上限的,不可能無限制的寫入。

MySQL的兩階段提交機制是什么

以上圖為例,配置了4個redo log,write pos就是代表當(dāng)前記錄寫到什么位置了,而check point表示一個推進點,它會不斷的前移,做擦除數(shù)據(jù)的操作,以保證redo log可以不斷的寫入。

當(dāng)然,擦除數(shù)據(jù)之前,會把redo log的記錄刷新到磁盤。

通過redo log,可以保證即使MySQL發(fā)生異常重啟,數(shù)據(jù)也不會丟失(因為redo log是物理日志,可以進行重放),這個特性就叫做crash-safe。

bin log

bin log是MySQL Server提供的一種日志,叫做歸檔日志,所有引擎都可以使用bin log。

那bin log和redo log的區(qū)別是什么呢?

1,這兩種日志的提供者不同:bin log是由MySQL Server提供的,redo log是InnoDB引擎特有的。

2,redo log主要記錄的是某個數(shù)據(jù)頁做了什么修改,bin log記錄的是語句的原始邏輯,比如更新了某一行的某個字段。

3,redo log是循環(huán)寫的,數(shù)據(jù)會被覆蓋。bin log是追加寫,一個文件寫滿,就寫下一個文件。

兩階段提交

介紹完了redo log和bin log,我們再看一下他們兩者是如何配合完成兩階段提交的。

MySQL的兩階段提交機制是什么

上圖就是一個更新數(shù)據(jù)的流程,可以看到,在更新一條數(shù)據(jù)之前,MySQL會先將數(shù)據(jù)加載到內(nèi)存,然后更新內(nèi)存,開始寫redo log。

此時,redo log處于prepare狀態(tài),等到bin log寫完之后,再提交事務(wù),這一條記錄的更新操作就算完成了。

redo log prepare -> 寫bin log -> redo log commit,這個流程就叫做兩階段提交。

下面我們分析一下,采用兩階段提交的好處。

情景一,redo log處于prepare狀態(tài)時,如果寫bin log失敗了,那么更新失敗,此時redo log沒有commit,bin log也沒有記錄,兩者的狀態(tài)是一致的,沒有問題。

情景二,redo log處于prepare狀態(tài)時,寫bin log成功,但是宕機導(dǎo)致commit失敗了。此時bin log產(chǎn)生了記錄,redo log沒有寫入成功,數(shù)據(jù)暫時不一致。

但是不用擔(dān)心,當(dāng)MySQL重啟時,會檢查redo log中處于prepare狀態(tài)的記錄。在redo log中,記錄了一個叫做XID的字段,這個字段在bin log中也有記錄,MySQL會通過這個XID,如果在bin log中找到了,那么就commit這個redo log,如果沒有找到,說明bin log其實沒有寫成功,就放棄提交。

通過這樣的機制,保證了redo log和bin log的一致性。

讀到這里,這篇“MySQL的兩階段提交機制是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI