您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)二階段提交在MySQL中的廣義應(yīng)用是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
二階段提交介紹
事務(wù)發(fā)起者(AP):定義事務(wù)邊界(開始、結(jié)束),并操作事務(wù)邊界內(nèi)的資源。
事務(wù)協(xié)調(diào)者(TM):負(fù)責(zé)管理事務(wù)(提交、回滾),監(jiān)控事務(wù)執(zhí)行進(jìn)度,分為事務(wù)唯一標(biāo)識(shí)
事務(wù)參與者(RM):根據(jù)“事務(wù)協(xié)調(diào)者”命令進(jìn)行操作,管理本地共享資源,記錄執(zhí)行日志
TM:對(duì)RM發(fā)送Prepare指令,等待RM的回執(zhí)(ACK)
RM:接收TM發(fā)送的指令,鎖定資源,執(zhí)行事務(wù)操作,但不提交。記錄撤銷日志和重做日志,如果事務(wù)執(zhí)行成功,回復(fù)“是”;如失敗,回復(fù)“否”
TM:如果接收到了所有RM的“是”回執(zhí),發(fā)送Commit給RM;如果在超時(shí)時(shí)間內(nèi)有RM沒有任何回執(zhí),或者有RM回復(fù)了“否”,發(fā)送Rollback給RM。
RM:根絕TM發(fā)送的指令執(zhí)行Commit或者Rollback操作,針對(duì)Rollback操作,RM使用表決階段記錄的撤銷日志。操作完成后給TM發(fā)送回執(zhí)“OK”。如果收不到指令,一直等待。
- 二階段提交的應(yīng)用 -
- MySQL中binlog和redo log的二階段提交廣義應(yīng)用 -
MySQL的雙日志(binlog 和 redo log)記錄采用二階段提交保證數(shù)據(jù)的強(qiáng)一致性。
binlog是由MySQL Server層記錄,與任何存儲(chǔ)引擎無關(guān)。binlog主要記錄的是操作日志,有三種格式:Statement、Row、Mixedlevel。binlog的主要用途是故障恢復(fù)、主從同步。
如果是先寫binlog 再寫 redo log。當(dāng)binlog寫入成功后,redo log未寫入成功,主節(jié)點(diǎn)宕機(jī),此時(shí)分兩個(gè)狀態(tài):
事務(wù)執(zhí)行中,由于Innodb存儲(chǔ)引擎的恢復(fù)是基于redo log的,此時(shí)master和slave都沒有該數(shù)據(jù),數(shù)據(jù)是一致的。
事務(wù)已提交,master基于redo log的恢復(fù)后的數(shù)據(jù)和slave中的數(shù)據(jù)會(huì)出現(xiàn)不一致問題。
如果先寫redo log再寫binlog。當(dāng)redo log寫入成功后,主節(jié)點(diǎn)宕機(jī),此時(shí)分兩種狀態(tài):
事務(wù)執(zhí)行中,由于當(dāng)前事務(wù)沒有提交,基于redo log恢復(fù),未提交的時(shí)候不會(huì)寫入,slave和master都沒有該數(shù)據(jù),數(shù)據(jù)是一致的。
事務(wù)已提交,redo log的事務(wù)已提交,binlog 記錄的事務(wù)沒有提交,master節(jié)點(diǎn)重啟后,該數(shù)據(jù)會(huì)寫入master節(jié)點(diǎn),而slave節(jié)點(diǎn)沒有,數(shù)據(jù)不一致。
綜上所述,只有事務(wù)處于已提交狀態(tài)的情況下,才會(huì)出現(xiàn)數(shù)據(jù)不一致問題。為了保證數(shù)據(jù)一致性。事務(wù)提交時(shí),redo log和binlog的Commit操作需要在同一個(gè)事務(wù)里,由于binlog和redo log由不同的層記錄,需要分布式事務(wù),為了保證數(shù)據(jù)一致性,二階段提交滿足這樣的需求場(chǎng)景。
- MySQL二階段提交特殊性 -
常規(guī)二階段提交協(xié)議中,TM發(fā)個(gè)Prepare信息給RM是串行有序的。
MySQL中,Server 先發(fā)給redo log 進(jìn)行Prepare fsync操作(數(shù)據(jù)寫入磁盤)
常規(guī)二階段提交協(xié)議中,TM發(fā)個(gè)Commit信息給RM是無序的,不用關(guān)注RM發(fā)送的先后順序。
MySQL的二階段,Server 先發(fā)給binLog 進(jìn)行write + fsync進(jìn)行合并操作,然后在通知redo log進(jìn)行Commit。
少一次交互(對(duì)于分布式事務(wù)來說就少一次網(wǎng)絡(luò)io)
少一次持久化操作(少一次磁盤io)
以上就是二階段提交在MySQL中的廣義應(yīng)用是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。