1. 程式人生 > >聊一聊 MySQL 中的資料編輯過程中涉及的兩階段提交

聊一聊 MySQL 中的資料編輯過程中涉及的兩階段提交

MySQL 資料庫中的兩階段提交,不知道您知道不?這篇文章就簡單的聊一聊 MySQL 資料庫中的兩階段提交,兩階段提交發生在資料變更期間(更新、刪除、新增等),兩階段提交過程中涉及到了 MySQL 資料庫中的兩個日誌系統:redo 日誌和 binlog 檔案。

redo 日誌前面已經介紹過了,就不再介紹了,簡單的聊一聊 binlog 檔案,binlog 是 MySQL server 層提供的二進位制檔案,因此所有的儲存引擎都可以使用 binlog 功能,binlog 是追加寫的邏輯日誌,記錄了執行語句的原始邏輯,檔案寫到指定大小後會切換到下一個檔案繼續寫,並不會覆蓋以前寫過的日誌檔案。

binlog 日誌檔案主要用於資料恢復和叢集環境下各伺服器之間的資料同步,在工作中,我們誤刪了資料或者表之類,如果需要恢復的話都是利用 binlog 日誌來恢復的,所以 binlog 日誌是 MySQL 資料庫中比較重要的模組。

知道這兩個日誌之後,我們把重點回到 MySQL 資料庫兩階段提交,前面我們說了兩階段提交發生在資料變更期間,為了更好的理解兩階段提交,我們用一條更新命令來加以說明,更新語句如下:

mysql> update T set c=c+1 where id=2;

假設未更新前 id=2 的這行資料 c 的值為 0 ,這條更新語句在 MySQL 資料庫內部是如何執行的呢?在下面這張執行流程圖:

從流程圖中可以看出,在 InnoDB 儲存引擎下,一條 update 語句在 MySQL 內部執行大概會經歷下面五個步驟:

  • 1、執行器先找引擎取 id=2 這一行資料,如果 ID=2 這一行所在的資料頁本來就在記憶體中,就直接返回給執行器;否則,需要先從磁碟讀入記憶體,然後再返回。

  • 2、執行器拿到引擎給的行資料,把這個值加上 1,比如原來是 N,現在就是 N+1,得到新的一行資料,再呼叫引擎介面寫入這行新資料。
  • 3、引擎將這行新資料更新到記憶體中,同時將這個更新操作記錄到 redo log 裡面,此時 redo log 處於 prepare 狀態。然後告知執行器執行完成了,隨時可以提交事務。
  • 4、執行器生成這個操作的 binlog,並把 binlog 寫入磁碟。
  • 5、執行器呼叫引擎的提交事務介面,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成。

在這五步中,注意用紅顏色標出來的部分,redo 日誌被分割成 prepare 和 commit 兩個階段提交,這個過程稱為兩階段提交,不將 redo 日誌拆分成兩步提交行不行?

我們可以用反推法來證明,假設不使用兩階段提交,那麼就有兩種情況,一種是先提交 redo 日誌再提交 binlog 日誌,另一種是先提交 binlog 日誌再提交 redo 日誌,一起來看看這兩種提交方式有什麼問題?

先寫 redo log 後寫 binlog。假設在 redo log 寫完,binlog 還沒有寫完的時候,MySQL 程序異常重啟。在這個過程中更新發生了異常,redo 日誌是可以在資料庫發生異常是保證資料的永續性,啟動後經過 redo 日誌資料恢復後 c 的值是 1,但是 binlog 並沒有寫完,所以在 binlog 日誌檔案中並沒有記錄這條更新語句,如果用這個 binlog 日誌檔案來恢復臨時庫的話,恢復出來 id =2 的這行資料的 c 的值為 0,與原庫的值就不一致了。

先寫 binlog 後寫 redo log。如果在 binlog 寫完, redo 日誌還沒寫,系統崩潰,系統重啟後,id=2 的這行資料的 c 的值還是為 0,但是在 binlog 日誌檔案中卻記錄了這次更新,如果需要用 binlog 日誌檔案來恢復臨時庫的話,那麼 id=2 的這行資料 c 的值就為 1,這樣與原庫的值就不一致了。

從這兩個假設中,我們可以看出無論先提交那個日誌檔案都有可能出現數據不一致的現象,日誌檔案兩階段提交技術就解決了redo 日誌和 binlog 日誌檔案記錄資料不一致的問題,從而保證了在資料恢復時資料的一致性。

以上就是 MySQL 資料編輯中涉及到的兩階段提交,希望這篇文章對您的學習或者工作有所幫助,如果您覺得文章有幫助,歡迎幫忙轉發,謝謝。

最後

目前網際網路上很多大佬都有 MySQL 相關文章,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支援。若文中有所錯誤之處,還望提出,謝謝。

歡迎掃碼關注微信公眾號:「網際網路平頭哥」,和平頭哥一起學習,一起進步。

相關推薦

MySQL 資料編輯過程涉及階段提交

MySQL 資料庫中的兩階段提交,不知道您知道不?這篇文章就簡單的聊一聊 MySQL 資料庫中的兩階段提交,兩階段提交發生在資料變更期間(更新、刪除、新增等),兩階段提交過程中涉及到了 MySQL 資料庫中的兩個日誌系統:redo 日誌和 binlog 檔案。 redo 日誌前面已經介紹過了,就不再介紹了,簡

【番外篇】深度學習資料增強與實現

深度學習的訓練往往需要海量的資料,而如今資料又是如此的寶貴(如醫學影象),因此如何利用有效的資料獲得更好的效果呢?資料增強(data augmentation)就是一種常用的方法。 工欲善其事必先利其器。 先來看下實現本文資料增強所需要的必要環境: python3.5

資料倉庫的元資料管理系統

原文地址 一、元資料的定義 按照傳統的定義,元資料(Metadata)是關於資料的資料。在資料倉庫系統中,元資料可以幫助資料倉庫管理員和資料倉庫的開發人員非常方便地找到他們所關心的資料;元資料是描述資料倉庫內資料的結構和建立方法的資料,可將其按用途的不同分為兩類:

借 redis cluster 叢集,叢集資料分佈演算法

Redis Cluster 叢集中涉及到了資料分佈問題,因為 redis cluster 是多 master 的結構,每個 master 都是可以提供儲存服務的,這就會涉及到資料分佈的問題,在新的 redis 版本中採用的是虛擬槽分割槽技術來解決資料分佈的問題,關於什麼是虛擬槽分割槽技術我們後面會詳細的介紹。

MySQL 的事務及其實現原理

說到資料庫,那就一定會聊到事務,事務也是面試中常問的問題,我們先來一個面試場景: 面試官:"事務的四大特性是什麼?" 我:"ACID,即原子性(Atomicity)、隔離性(Isolation)、永續性(Durability)、一致性(Consistency)!" 面試官:"在 MySQL 資料庫的 Inno

深度學習常用的激勵函式

   大家都知道,人腦的基本計算單元叫做神經元。現代生物學表明,人的神經系統中大概有860億神經元,而這數量巨大的神經元之間大約是通過1014−1015個突觸連線起來的。上面這一幅示意圖,粗略地描繪了一下人體神經元與我們簡化過後的數學模型。每個神經元都從樹突接受訊號,同時順著某個軸突傳遞

資料分析師這個職業

本文來自網易雲社群前面很多位已經把資料分析師的具體工作職責和工作內容說得較為詳細,我來解答一下如何成為一名優秀的資料分析師。首先,基礎知識。基礎知識最重要,資料分析師需要掌握的基礎知識比較廣,除了分析層面的,還有操作層面的。在分析層面,需要學習包括統計學,資料分析等在內的一系

嵌入式常用的實時作業系統(RTOS)

嵌入式Linux系統 VS RTOS 一提到嵌入式的作業系統,自然繞不開嵌入式Linux作業系統。嵌入式linux 是將日益流行的Linux作業系統進行裁剪修改,使之能在嵌入式計算機系統上執行。它效能優異,軟體移植容易,程式碼開放,有許多應用軟體支援,應用產品開發週期短,新

Android 巧妙的位操作

前言 我們之前,在計算機當中,它是以二進位制的形式來進行數的儲存和加減乘除的。 講解之前,我們先來了解一下基本的位操作 位操作 含義 具體含義 & 表示與

次MSSQL到MySQL資料遷移過程

工作中遇到一個需求 要將MSSQL資料庫中共計12張表的資料大概1000W行資料遷移到MySQL資料庫中,去年另一個同事負責這件事情,他採用的方法是先將MSSQL資料庫裡的資料生成同MySQL資料庫表結構一致的12張表,然後用我提供的一個delphi寫的一個工具來進行遷移。工具用的UniDAC的TCRBa

Python 2 的編碼

在 Python 尤其是 Python2 中,編碼問題是困擾開發者尤其初學者的一大問題。什麼 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人頭都大了。其實不然,這有點類似 Java 中 java.io 包一樣,看似龐大難懂,但是可以非常精細地

Javadouble精度去哪了

前段時間, 因為要測試一個剛出爐的高頻策略, 放實盤去跑吧, 怕出岔, 所以寫了個簡單的回測系統, 跑一遍歷史資料. 其中有一部分是關於撮合系統, 簡陋了點, 還算能跑得起來, 幾個用例下來, 也沒什麼問題, 接著增加歷史資料量, 居然出現了負數, 簡直不可能發生的事情居然出現了, 雖然都是小金額的偏差,

JQdelegate事件委託的好處

下面舉個例子 我們希望通過點選使得點選的li標籤變紅 HTML <body style="height:2000px;"> <ul> <li>1111&

從nginx熱更新Golang的伺服器熱更新(上)

從nginx熱更新聊一聊Golang中的熱更新(上) 靜態語言在伺服器程式設計時都會遇到這樣的問題:如何保證已有的連線服務不中斷同時又升級版本? 最近花了點時間看了下nginx熱更新程式碼流程,想了下結合之前的經驗一併總結下熱更新 熱更新是什麼? 舉個例子,

資料庫的鎖

背景 資料庫中有一張叫後宮佳麗的表,每天都有幾百萬新的小姐姐插到表中,光陰荏苒,夜以繼日,日久生情,時間長了,表中就有了幾十億的小姐姐資料,看到幾十億的小姐姐,每到晚上,我可愁死了,這麼多小姐姐,我翻張牌呢? 辦法當然是精兵簡政,刪除那些age>18的,給年輕的小姐姐們留位置... 於是我在資料庫中添加

Java的各種運算子

計算機之所以叫“計算機”,其最基本用途之一就是運算,對應剛剛接觸Java的小夥伴而言,熟悉並掌握Java中的各種運算子及其在表示式中的運算優先順序是十分必要的。 算術運算 算術運算主要用來處理數學中的加、減、乘、除四則運算。是最簡單、最常用的運算子。 1. 除與取模:資料做

webpack 的 preloading 和 Prefetching

聊一聊 webpack 中的 preloading 和 Prefetching 提到 Preloading 和 Prefetching 就不得不先說一下程式碼分割,通過下面的例子我們來說明為什麼需要程式碼分割? // index.js import _ from 'lodash'; // 假設大小為 1 MB

簡單JS的迴圈引用及問題

本文主要從 JS 中為什麼會出現迴圈引用,垃圾回收策略中引用計數為什麼有很大的問題,以及迴圈引用時的物件在使用 JSON.stringify 時為什麼會報錯,怎樣解決這個問題簡單談談自己的一些理解。 1. 什麼是迴圈引用 當物件 1 中的某個屬性指向物件 2,物件 2 中的某個屬性指向物件 1 就會出現迴圈引

InnoDB 引擎的索引型別

索引對資料庫有多重要,我想大家都已經知道了吧,關於索引可能大家會對它多少有一些誤解,首先索引是一種資料結構,並且索引不是越多越好。合理的索引可以提高儲存引擎對資料的查詢效率。 形象一點來說呢,索引跟書本的目錄一樣,能否快速的查詢到你需要的資訊,取決於你設計的目錄是否合理。 MySQL 資料庫有很多種索引,每種

InnoDB 引擎的這些索引策略

在上一篇中,我們簡單的介紹了一下 InnoDB 引擎的索引型別,這一篇我們繼續學習 InnoDB 的索引,聊一聊索引策略,更好的利用好索引,提升資料庫的效能,主要聊一聊覆蓋索引、最左字首原則、索引下推。 覆蓋索引 覆蓋索引是指在普通索引樹中可以得到查詢的結果,不需要在回到主鍵索引樹中再次搜尋。 建立如下這張表