mysql事務(wù)提交
1、

當(dāng)事務(wù)commit時,需要將事務(wù)狀態(tài)設(shè)置為COMMIT狀態(tài),這里同樣通過Undo來實現(xiàn)的
入口函數(shù):trx_commit_low-->trx_write_serialisation_history
trx_undo_set_state_at_finish
2、
二階段提交流程
時間點1
prepare 階段
時間點2
commit 階段
時間點3
時間點1出現(xiàn)問題
這個時候redo log 和 binlog都在內(nèi)存中,所以本次事務(wù)的相關(guān)操作都會消失,相對于事務(wù)回滾了,不影響數(shù)據(jù)的一致性。
時間點2出現(xiàn)問題
這個時候redo log已經(jīng)到磁盤了。binlog沒有刷到磁盤所以會消失。服務(wù)器從故障中恢復(fù)時,讀取磁盤中的redo log ,但是由于對應(yīng)的redo log項還是prepare狀態(tài),就要判斷binlog 是否完整,如果binlog完整則提交事務(wù),如果binlog不完整則回滾事務(wù)。
時間點3出現(xiàn)問題。
這個時候redo log 和 binlog都已經(jīng)存磁盤,服務(wù)器從redo log恢復(fù)就好了。
binlog怎么判斷完整性:
statement 格式的 binlog,最后會有 COMMIT;
row 格式的 binlog,最后會有一個 XID event
redolog 和binlog怎么聯(lián)系起來:
它們有一個共同的數(shù)據(jù)字段,叫 XID。
崩潰恢復(fù)的時候,會按順序掃描 redo log:如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;如果碰到只有 parepare、而沒有 commit 的 redo log,就拿著 XID 去 binlog 找對應(yīng)的事務(wù)。
來自
3、
redo日志僅記錄對頁的物理修改,不包含事務(wù)信息,因此在崩潰恢復(fù)時單純依靠redo日志只能進行前滾,即恢復(fù)到崩潰前的內(nèi)存狀態(tài)。但是這個時候有些事務(wù)還沒有提交(活躍事務(wù))需要回滾,這就需要依賴undo,undo中記錄了未提交事務(wù)及修改行的原始版本,崩潰恢復(fù)時找到這些活躍事務(wù)將原始版本還原完成回滾。因此事務(wù)是否提交信息保存在undo里。
鏈接:https://www.zhihu.com/question/362498822/answer/951351986
4、
這些都是由事務(wù)性存儲引擎來完成的,但 binlog 不在事務(wù)存儲引擎范圍內(nèi),而是由 Mysql Server 來記錄的。
那么就必須保證 binlog 數(shù)據(jù)和 redo log 之間的一致性,所以開啟了 binlog 后實際的事務(wù)執(zhí)行就多了一步,如下:
先記錄 undo/redo log,確保日志刷到磁盤上持久存儲。
更新數(shù)據(jù)記錄,緩存操作并異步刷盤。
將事務(wù)日志持久化到 binlog。
提交事務(wù),在 redo log 中寫入commit記錄。
這樣的話,只要 binlog 沒寫成功,整個事務(wù)是需要回滾的,而 binlog 寫成功后即使 Mysql Crash 了都可以恢復(fù)事務(wù)并完成提交。
要做到這點,就需要把 binlog 和事務(wù)關(guān)聯(lián)起來,而只有保證了 binlog 和事務(wù)數(shù)據(jù)的一致性,才能保證主從數(shù)據(jù)的一致性。
所以 binlog 的寫入過程不得不嵌入到純粹的事務(wù)存儲引擎執(zhí)行過程中,并以內(nèi)部分布式事務(wù)(xa 事務(wù))的方式完成兩階段提交。
5、
疑問:事務(wù)的順序提交問題,備機回放時怎么保證順序提交的(相關(guān)信息是怎么通過redo傳遞的)?
MySQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。