政府網(wǎng)站內(nèi)容建設(shè)方案怎么免費(fèi)注冊(cè)域名
??? 書(shū)接上一篇文章,MySQL通過(guò)不同的策略來(lái)保證事務(wù)的ACID:原子性、一致性、隔離性、持久性,通過(guò)鎖機(jī)制實(shí)現(xiàn)隔離性,通過(guò)redo+undo+binlog三種日志實(shí)現(xiàn)事務(wù)的原子性、一致性和持久性。
??? 本文主要講MySQL的持久性的一個(gè)實(shí)現(xiàn)機(jī)制-兩階段提交策略。
?? 兩階段提交定義
?? 兩階段提交指的是MySQL在提交事務(wù)將臟數(shù)據(jù)刷盤(pán)的過(guò)程分為prepare和commit兩個(gè)階段,當(dāng)客戶端commit命令開(kāi)始執(zhí)行后,MySQL內(nèi)部開(kāi)啟一個(gè)XA(分布式事務(wù))事務(wù),并為該事務(wù)分配一個(gè)XID,先將redo log緩存中的數(shù)據(jù)刷新到日志,redo log刷盤(pán)后,redo log對(duì)該事務(wù)標(biāo)記為prepare,磁盤(pán)的redo日志中也就存在該XID。接著,將binlog緩存中的數(shù)據(jù)刷盤(pán),binlog刷盤(pán)完成后,磁盤(pán)的binlog中會(huì)存在該XID,會(huì)將該redo log上的事務(wù)標(biāo)記為commit。至此,客戶端發(fā)起的commit命令執(zhí)行完成。
??? 那么問(wèn)題來(lái)了,提交一個(gè)事務(wù)的時(shí)候直接寫(xiě)到binlog中不行么,為啥非得先對(duì)redo log刷盤(pán),然后再對(duì)binlog刷盤(pán)?
? 兩階段提交策略的作用
??? 這就引出了兩階段提交策略的作用:確保MySQL數(shù)據(jù)庫(kù)崩潰后重啟時(shí)能快速恢復(fù)。這個(gè)快速是建立在使用redo log恢復(fù)基礎(chǔ)上的,因?yàn)閞edo log的數(shù)據(jù)頁(yè)記錄的是物理頁(yè)的修改,并且大小和物理表空間中數(shù)據(jù)頁(yè)相同,利用redo log可以快速將未提交的事務(wù)提交并完成刷盤(pán),因此提交事務(wù)時(shí)要使用兩階段提交策略。
??? 數(shù)據(jù)庫(kù)崩潰時(shí)兩階段提交的不同情況
??? 數(shù)據(jù)庫(kù)崩潰時(shí),提交的事務(wù)(假設(shè)對(duì)表user中id=1 name="張三"的記錄執(zhí)行 update user set name="李四" where id = 1 )可能遇到如下
??? 1、redo log已經(jīng)刷盤(pán),事務(wù)被標(biāo)記為prepare狀態(tài),binlog尚未刷盤(pán),MySQL內(nèi)部開(kāi)啟的XA事務(wù)會(huì)給redo log標(biāo)記唯一的事務(wù)號(hào),binlog中不存在該事務(wù)號(hào)。
??? 2、redo log已經(jīng)刷盤(pán),事務(wù)被標(biāo)記為prepare狀態(tài),binlog已經(jīng)完成刷盤(pán),MySQL內(nèi)部開(kāi)啟的XA事務(wù)會(huì)給redo log和binlog分別標(biāo)記相同的事務(wù)號(hào)。
??? 3、redo log和binlog都已經(jīng)完成刷盤(pán),事務(wù)被標(biāo)記為commit狀態(tài)。
??? 數(shù)據(jù)庫(kù)崩潰恢復(fù)時(shí),會(huì)檢查redo log中的XA事務(wù)號(hào)是否在binlog中能找到。
??? 針對(duì)第1種情況,binlog中不存在redo log 中的XA事務(wù)號(hào),則直接將事務(wù)回滾。
??? 針對(duì)第2種情況,binlog中找到了redo log中的XA事務(wù)號(hào),但事務(wù)仍然是prepare狀態(tài),說(shuō)明binlog將修改刷盤(pán)后還沒(méi)有來(lái)得及標(biāo)記該事務(wù)為commit狀態(tài)數(shù)據(jù)庫(kù)就已經(jīng)崩潰了,這個(gè)時(shí)候直接提交該事務(wù)即可。
????針對(duì)第3種情況,說(shuō)明事務(wù)已經(jīng)成功提交,崩潰恢復(fù)時(shí)事務(wù)無(wú)須處理。
??? 到這里兩階段提交策略就沒(méi)有問(wèn)題了,但愛(ài)學(xué)習(xí)的小伙伴肯定就會(huì)問(wèn)了,都說(shuō)學(xué)以致用,那么理解兩階段提交策略原理到底有什么用呢?
??? 哈哈哈哈,這個(gè)問(wèn)題我也在思考,除了裝逼之外,我暫時(shí)想不到其他在工作中能具體用到的地方,留作以后補(bǔ)充吧。
???