1.兩階段提交
mysql中經常說的wal技術,wal的全稱是write- ahead logging,它的關鍵點就是先寫日誌,再寫磁碟。即當有一條記錄需要更新時,innodb引擎就會先把記錄寫到redo log裡,並更新記憶體,這個時候更新就完成了。因為如果每一次的更新操作都需要寫進磁碟,然後磁碟也要找到對應的那條記錄,然後再更新,整個過程io成本、查詢成本都很高。
image.png
在執行一條update語句時候,通過聯結器、分析器、優化器之後,呼叫操作引擎,將新行寫入記憶體,寫入redo log,狀態為prepare->寫binlog->redo log狀態修改為commit。寫入redo的過程分為了prepare和commit稱為二階段提交。
採用二階段提交的原因
如果只進行一次寫入redolog和寫入binlog是有問題的。不管先寫誰。首先知道一點,redolog是對資料庫實際進行的操作。
redo和binlog這兩種日誌有以下三點不同:
1、 redo log 是 innodb 引擎特有的;binlog 是 mysql 的 server 層實現的,所有引擎都可以使用。
2、 redo log 是物理日誌,記錄的是「在某個資料頁上做了什麼修改」;binlog 是邏輯日誌,記錄的是這個語句的原始邏輯,比如「給 id=2 這一行的 c 欄位加 1 」。
3、redo log 是迴圈寫的,空間固定會用完;binlog 是可以追加寫入的。「追加寫」是指 binlog 檔案寫到一定大小後會切換到下乙個,並不會覆蓋以前的日誌。
2.採用二階段提交的原因
先寫redolog再寫binlog
如果在一條語句redolog之後崩潰了,binlog則沒有記錄這條語句。系統在crash recovery時重新執行了一遍binlog便會少了這一次的修改。恢復的資料庫少了這條更新。
先寫binlog再寫redolog
如果在一條語句binlog之後崩潰了,redolog則沒有記錄這條語句(資料庫物理層面並沒有執行這條語句)。系統在crash recovery時重新執行了一遍binlog便會多了這一次的修改。恢復的資料庫便多了這條更新。
crash recovery
在做crash recovery時,分為以下3種情況:
binlog有記錄,redolog狀態commit:正常完成的事務,不需要恢復;
binlog有記錄,redolog狀態prepare:在binlog寫完提交事務之前的crash,恢復操作:提交事務。(因為之前沒有提交)
binlog無記錄,redolog狀態prepare:在binlog寫完之前的crash,恢復操作:回滾事務(因為crash時並沒有成功寫入資料庫)
MySQL 兩階段提交
在mysql中,所謂的兩階段提交就是redo log和binlog 兩個階段的commit過程。在兩階段提交的不同時刻,mysql 異常重啟會出現什麼現象?1 在時刻 a 發生宕機,也就是寫入 redo log 處於 prepare 階段之後 寫 binlog 之前,發生了崩潰 crash 由於此時...
MySQL兩階段提交
學習自葉大blog 例子和解釋都很詳細,不再改動,僅作筆記。db2的連線 db2,err sql.open mysql root 123456 tcp 127.0.0.1 3307 hade2 if err nil defer db2.close 開始前顯示 var score int db1.qu...
兩階段提交
1 二階段提交協議 一般分為協調器c和若干事務執行者si兩種角色 當執行某一事務t的所有站點si都通知c事務執行完成,c即啟動二階段提交協議。1.首先c向所有si發訊息 c先將訊息寫到本機日誌 si收到訊息後,根據本機t的執 況,如果成功返回,不成功返回。返回前都應把要返回的訊息寫到日誌裡 2.c收...