欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中的兩階段提交詳解(2PC)

 更新時(shí)間:2025年05月12日 11:10:39   作者:小紅的布丁  
這篇文章主要介紹了MySQL中的兩階段提交(2PC),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

引言

在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?ambiguous的原因和解決

    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-04
  • mysql查看死鎖與去除死鎖示例詳解

    mysql查看死鎖與去除死鎖示例詳解

    這篇文章主要給大家介紹了關(guān)于mysql查看死鎖與去除死鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • linux環(huán)境下安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程

    linux環(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的心得(八)--插入 更新 刪除

    這一篇《與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)》將會(huì)講解MYSQL的插入、更新和刪除語句
    2014-08-08
  • MySQL組合索引(多列索引)使用與優(yōu)化案例詳解

    MySQL組合索引(多列索引)使用與優(yōu)化案例詳解

    這篇文章主要介紹了MySQL組合索引(多列索引)使用與優(yōu)化,主要包括多列索引,測(cè)試案例及過程以及多列索引的使用順序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • MySQL基本操作語句小結(jié)

    MySQL基本操作語句小結(jié)

    這篇文章主要介紹了MySQL的基本操作語句,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07
  • mysql 5.7.13 解壓縮版(免安裝)安裝配置教程

    mysql 5.7.13 解壓縮版(免安裝)安裝配置教程

    這篇文章主要介紹了MySQL 5.7.13 for Windows解壓縮版(免安裝)安裝配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 詳解MySQL如何實(shí)現(xiàn)數(shù)據(jù)批量更新

    詳解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-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
  • mysql中IFNULL,IF,CASE的區(qū)別介紹

    mysql中IFNULL,IF,CASE的區(qū)別介紹

    本文將詳細(xì)介紹mysql中IFNULL,IF,CASE的區(qū)別,需要了解的朋友可以參考下
    2012-11-11

最新評(píng)論