binlog原理?
第一階段:InnoDB prepare, write/sync redo log;binlog不作任何操作;
第二階段:包含兩步,1> write/sync Binlog; 2> InnoDB commit (commit in memory);
當(dāng)然在5.6之后引入了組提交的概念,可以在IO性能上進(jìn)行一些提升,但總體的執(zhí)行順序不會(huì)改變。
當(dāng)?shù)诙A段的第1步執(zhí)行完成之后,binlog已經(jīng)寫入,MySQL會(huì)認(rèn)為事務(wù)已經(jīng)提交并持久化了(在這一步binlog就已經(jīng)ready并且可以發(fā)送給訂閱者了)。在這個(gè)時(shí)刻,就算數(shù)據(jù)庫發(fā)生了崩潰,那么重啟MySQL之后依然能正確恢復(fù)該事務(wù)。在這一步之前包含這一步任何操作的失敗都會(huì)引起事務(wù)的rollback。
第二階段的第2步大部分都是內(nèi)存操作,比如釋放鎖,釋放mvcc相關(guān)的read view等等。MySQL認(rèn)為這一步不會(huì)發(fā)生任何錯(cuò)誤,一旦發(fā)生了錯(cuò)誤那就是數(shù)據(jù)庫的崩潰,MySQL自身無法處理。這個(gè)階段沒有任何導(dǎo)致事務(wù)rollback的邏輯。在程序運(yùn)行層面,只有這一步完成之后,事務(wù)導(dǎo)致變更才能通過API或者客戶端查詢體現(xiàn)出來。