Mysql兩階段提交

在看Mysql相關內容的時候常常聽到兩階段提交,那之前都是雲裏霧裏的,經過學習丁奇老師的這篇文章完全明白了其流程和含義。node

提到兩階段提交,必須先說一下兩個日誌:redo logbinlogsql

重要的日誌模塊:redo log

數據在磁盤中是按照主鍵順序存儲的,在對數據進行更新操做(insert、update、delete)的時候,既要寫數據又可能對其餘數據進行移動,若是每次都寫進磁盤是很耗性能的。redo log這裏就用到的WAS技術,WAL的全稱是Write-Ahead Logging,它的關鍵點是先寫日誌再寫磁盤,而且 寫日誌是順序寫 速度很快。數據庫

具體來講,當有一條記錄須要更新的時候,InnoDB 引擎就會先把記錄寫到redo log,並更新內存,這個時候更新就算是完成了。同時Innodb引擎會在適當的時候講這個操做更新到磁盤裏面。性能

Innodeb的redo log是固定大小的,好比能夠配置爲一組4個文件,每一個文件的大小是1GB,那麼總共能夠記錄4GB的操做,從頭開始寫,寫到末尾就又會到開始循環。固然當大小不夠的時候會講數據刷新到磁盤(數據文件內)。學習

有了redo log Innodb就能夠保證即便數據庫發生異常重啓,以前提交的記錄都不會丟失,這個能力稱爲crash-safe.spa

重要的日誌模塊:binlog

前面提到的redo log是Innodb提供的,而binlog是Server層提供的。這兩個日誌有以下不一樣日誌

  • redo logInnodb引擎特有的;binlogMysql Server層實現的,全部引擎均可以使用code

  • redo log是物理日誌,記錄的是"在某個數據頁上作了什麼操做";binlog是邏輯日誌,記錄的是這個語句的原始邏輯,好比"給ID=2這一行的C字段加1"接口

  • redo log是循環寫的;binlog是追加的,不會覆蓋之前的日誌事務

  • binlog用於主從同步、恢復數據(誤刪除)和擴容等

兩階段提交

update test set age = age +1 where id = 1 當執行這條語句的時候,咱們看看它的內部流程

  • 執行器先去引擎找id=1的這一行,id是主鍵引擎直接用樹搜索找到這一行。若是這一行的數據頁在內存中,就直接返回給執行器,不然就須要從磁盤讀取而後在返回。

  • 執行器拿到引擎提供的行數據,給age字段加1,好比原來是9,如今就是10,獲得新的一行數據,在調用引擎接口寫入這行數據

  • 引擎將新的數據行更新到內存中,同時將這個更新操做記錄到redo log,此時redo log處於prepare狀態,而後告知執行器執行完成了,隨時能夠提交事務

  • 執行器生成這個操做的binlog,並把binlog寫入磁盤

  • 執行器調用引擎接口,引擎把剛剛寫的redo log改爲提交commit狀態,更新完成。

最後三步比較繞,將redo log的寫入拆成了兩個步驟preparecommit,這就是兩階段提交

相關文章
相關標籤/搜索