mysql commit一個(gè)dml餐塘,在開啟了binlog的情況下妥衣,為了保證binlog跟redo log 數(shù)據(jù)的一致性,mysql引入了兩階段提交戒傻。在事務(wù)commit的時(shí)候税手,會(huì)在兩階段提交的commit階段,先將整個(gè)事務(wù)寫入redolog需纳,此時(shí)redolog還沒有commit的標(biāo)識(shí)芦倒。然后會(huì)將事務(wù)寫入binlog,binlog commit成功之后不翩,才會(huì)將commit標(biāo)識(shí)寫入redo log兵扬,并且告訴引擎層進(jìn)行事務(wù)的提交。
以上的圖片中可以看到口蝠,事務(wù)的提交主要分為兩個(gè)主要步驟:
1. 準(zhǔn)備階段(Storage Engine(InnoDB) Transaction Prepare Phase)
此時(shí)SQL已經(jīng)成功執(zhí)行器钟,并生成xid信息及redo和undo的內(nèi)存日志。然后調(diào)用prepare方法完成第一階段妙蔗,papare方法實(shí)際上什么也沒做傲霸,將事務(wù)狀態(tài)設(shè)為TRX_PREPARED,并將redo log刷磁盤灭必。
2. 提交階段(Storage Engine(InnoDB)Commit Phase)
2.1 記錄協(xié)調(diào)者日志狞谱,即Binlog日志。
如果事務(wù)涉及的所有存儲(chǔ)引擎的prepare都執(zhí)行成功禁漓,則調(diào)用TC_LOG_BINLOG::log_xid方法將SQL語(yǔ)句寫到binlog(write()將binary log內(nèi)存日志數(shù)據(jù)寫入文件系統(tǒng)緩存跟衅,fsync()將binary log文件系統(tǒng)緩存日志數(shù)據(jù)永久寫入磁盤)。
2.2 告訴引擎做commit播歼。
最后伶跷,調(diào)用引擎的commit完成事務(wù)的提交。會(huì)清除undo信息秘狞,刷redo日志叭莫。