MySQL中的兩階段提交詳解(2PC)
引言
在InnoDB存儲(chǔ)引擎中,當(dāng)啟用二進(jìn)制日志(Binlog)且執(zhí)行事務(wù)提交時(shí),會(huì)觸發(fā)兩階段提交(2PC)過程,以確保數(shù)據(jù)的一致性和持久化安全。
該過程首先將數(shù)據(jù)更新寫入redo log buffer和Binlog緩存,然后通過分階段的日志寫入和持久化操作,實(shí)現(xiàn)事務(wù)的準(zhǔn)備與提交狀態(tài)轉(zhuǎn)變。
兩階段提交機(jī)制不僅協(xié)調(diào)了InnoDB的事務(wù)日志與Binlog之間的同步,還依賴于關(guān)鍵配置參數(shù)如sync_binlog和innodb_flush_log_at_trx_commit,這些參數(shù)分別控制Binlog和redo log的寫入與持久化策略。
本文將圍繞兩階段提交的具體流程及相關(guān)配置,深入分析其在保證事務(wù)原子性和持久性中的核心作用。
兩階段提交過程
當(dāng)在 InnoDB 中執(zhí)行事務(wù),并且啟用了 Binlog 時(shí),提交事務(wù)時(shí)會(huì)觸發(fā)兩階段提交過程。
- 當(dāng)有數(shù)據(jù)需要更新的時(shí)候,InnoDB 引擎就會(huì)先把記錄寫到redo log buffer以及binlog cache(線程獨(dú)有的),并更新內(nèi)存(change buffer),這個(gè)時(shí)候更新就算完成了。
- 如果是唯一索引更新操作會(huì)寫入到redo log buffer,普通索引的更新操作會(huì)先寫入到change buffer,在合適的時(shí)機(jī)merge到redo log。
- 事務(wù)提交時(shí)寫入 redo log 并變成 prepare 狀態(tài)。(一階段)
- 再把 binlog cache 寫到 binlog 文件中,最后 redo log 變成 commit 狀態(tài)。(二階段)
sync_binlog配置
sync_binlog 用于控制commit時(shí)binlog的持久化,write表示將binlog cache中的日志,寫入到文件系統(tǒng)的 page cache,fsync將表示數(shù)據(jù)持久化到磁盤。
sync_binlog=0
的時(shí)候,表示每次提交事務(wù)都只 write,不 fsync。(5.7及以前默認(rèn)值)sync_binlog=1
的時(shí)候,表示每次提交事務(wù)都會(huì)執(zhí)行 fsync。(8.0及以后默認(rèn)值)sync_binlog=N(N>1)
的時(shí)候,表示每次提交事務(wù)都 write,但累積 N 個(gè)事務(wù)后才 fsync。
innodb_flush_log_at_trx_commit配置
innodb_flush_log_at_trx_commit 用于控制commit時(shí)redo log的持久化。
innodb_flush_log_at_trx_commit=0
的時(shí)候,表示每次事務(wù)提交時(shí)都只是把 redo log 留在 redo log buffer 中。innodb_flush_log_at_trx_commit =1
的時(shí)候,表示每次事務(wù)提交時(shí)都將 redo log 直接持久化到磁盤。(默認(rèn)值)innodb_flush_log_at_trx_commit=2
的時(shí)候,表示每次事務(wù)提交時(shí)都只是把 redo log 寫到 page cache。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL錯(cuò)誤代碼:1052?Column?'xxx'?in?field?list?is
今天在工作中寫sql語句時(shí)遇到了個(gè)sql錯(cuò)誤,為記錄并不再重復(fù)出錯(cuò),下面這篇文章主要給大家介紹了關(guān)于MySQL錯(cuò)誤代碼:1052?Column?'xxx'?in?field?list?is?ambiguous的原因和解決方法,需要的朋友可以參考下2023-04-04linux環(huán)境下安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程
這篇文章主要介紹了linux環(huán)境下安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)--插入 更新 刪除
這一篇《與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)》將會(huì)講解MYSQL的插入、更新和刪除語句2014-08-08詳解MySQL如何實(shí)現(xiàn)數(shù)據(jù)批量更新
最近需要批量更新大量數(shù)據(jù),習(xí)慣了寫sql,所以還是用sql來實(shí)現(xiàn),下面這篇文章主要給大家總結(jié)介紹了關(guān)于MySQL批量更新的方式,需要的朋友可以參考下2023-10-10使用Mycat-eye管理Mycat數(shù)據(jù)庫(kù)服務(wù)的操作
MyCat是一個(gè)開源的分布式數(shù)據(jù)庫(kù)系統(tǒng),是一個(gè)實(shí)現(xiàn)了MySQL協(xié)議的服務(wù)器,前端用戶可以把它看作是一個(gè)數(shù)據(jù)庫(kù)代理,用MySQL客戶端工具和命令行訪問,本文給大家介紹了使用Mycat-eye管理Mycat數(shù)據(jù)庫(kù)服務(wù)的操作,需要的朋友可以參考下2024-04-04