首先再明確一下MySQL的兩階段提交過程,如下圖所示:
如果在時刻1 數據庫宕機,則將事務回滾
如果在時刻2 數據庫宕機,則如果binlog 已經完整寫好,則提交事務;否則回滾事務。
Binlog存在固定的完整格式,statement格式的binlog,最後會有COMMIT;row格式的binlog,最後會有一個XID event,除此之外,還有check sum來進行內容校驗。而redo log與binlog通過XID進行關聯。
爲什麼binlog寫完整了就一定要提交事務?
因爲binlog會被應用到主從同步,如果從庫執行了binlog而主庫恢復的時候回滾事務,則會發生主從不一致。
Redo log buffer用於緩存一個事務中的多個更新內容,等到commit的時候寫入磁盤文件。
MySQL實戰45講