解析兩階段提交與三階段提交的核心差異及MySQL實現方案

引言

在分布式系統的事務處理中,如何保障跨節點數據操作的一致性始終是核心挑戰。經典的兩階段提交協議(2PC)通過準備階段與提交階段的協調機制,以同步決策模式確保事務原子性。其改進版本三階段提交協議(3PC)通過增加預提交階段和超時機制,旨在解決2PC的阻塞風險。值得注意的是,MySQL數據庫的Binlog與InnoDB引擎通過內部兩階段提交機制,實現了事務日志與存儲引擎狀態的一致性保障。

兩階段提交

第一階段:準備階段,第二階段:提交階段。將提議的節點稱為協調者(coordinator),其他參與決議節點稱為參與者。

第一階段:協調者發起一個提議,分別問詢各參與者是否接受,參與者如果認為自己可以提交事務,它們將執行所有必要的操作但不提交(記錄redo log,undo log),正常執行返回Yes,否則返回No。

第二階段:協調者根據參與者的反饋,提交或回滾事務,如果參與者全部同意則提交,只要有一個參與者不同意就回滾。

MySQL的兩階段提交

當在 InnoDB 中執行事務,并且啟用了 Binlog 時,提交事務時會觸發兩階段提交過程

  1. 當有數據需要更新的時候,InnoDB 引擎就會先把記錄寫到redo log buffer以及binlog cache(線程獨有的),并更新內存(chang buffer),這個時候更新就算完成了。
    1. 如果是唯一索引更新操作會寫入到redo log,普通索引的更新操作會先寫入到change buffer,在合適的時機merge到redo log。
  1. 事務提交時寫入 redo log 并變成 prepare 狀態。(一階段)
  2. 再把 binlog cache 寫到 binlog 文件中,最后 redo log 變成 commit 狀態。(二階段)

三階段提交

三階段提交,是二階段提交(2PC)的改進版本。與兩階段提交不同的是,三階段提交有兩個改動點。

  1. 引入超時機制。同時在協調者和參與者中都引入超時機制。
  2. 在第一階段和第二階段中插入一個準備階段。保證了在最后提交階段之前各參與節點的狀態是一致的。也就是說,除了引入超時機制之外,3PC把2PC的準備階段再次一分為二,這樣三階段提交就有CanCommit、PreCommit、DoCommit三個階段。

第一階段CanCommit:事務協調者向所有參與者發送詢問消息(CanCommit),詢問它們是否能夠提交事務。

第二階段PreCommit:協調者根據參與者的反應情況來決定是否可以進行事務的PreCommit操作。

  1. 參與者如果認為自己可以提交事務,它們將執行所有必要的操作但不提交(記錄redo log,undo log),并鎖定資源,然后向協調者發送準備提交(PreCommit)的響應。
  2. 協調者等待來自所有參與者的響應。如果收到所有參與者的肯定回復,它將進入提交階段;如果任何一個參與者否定或者等待超時,它將進入中止階段。

第三階段DoCommit

  1. 如果進入提交階段,協調者向所有參與者發送提交消息(doCommit),指示它們正式提交事務。
  2. 如果進入中止階段,協調者向所有參與者發送中止消息(abort),指示它們回滾事務。

兩階段提交和三階段提交區別?

阻塞性問題

兩階段提交會存在阻塞性問題,如果參與者都已經執行一階段,但協調者崩潰的話,參與者會進入等待狀態,直到協調者恢復并做出決定。

三階段提交利用超時機制解決阻塞性問題,參與者在預提交階段后等待協調者的最終提交請求時,如果超過超時時間可以選擇回滾事務。


感謝您的閱讀!如果文章中有任何問題或不足之處,歡迎及時指出,您的反饋將幫助我不斷改進與完善。期待與您共同探討技術,共同進步!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84373.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Towards Open World Object Detection概述(論文)

論文:https://arxiv.org/abs/2103.02603 代碼:https://github.com/JosephKJ/OWOD Towards Open World Object Detection 邁向開放世界目標檢測 Abstract 摘要 Humans have a natural instinct to identify unknown object instances in their environ…

QT3D學習筆記——圓臺、圓錐

類名作用Qt3DWindow3D渲染窗口容器QEntity場景中的實體(對象或容器)QCamera控制觀察視角QPointLight點光源QConeMesh圓錐幾何網格QTransform控制實體的位置/旋轉/縮放QPhongMaterialPhong光照材質(定義顏色、反光等)QFirstPersonC…

CSS | transition 和 transform的用處和區別

省流總結: transform用于變換/變形,transition是動畫控制器 transform 用來對元素進行變形,常見的操作如下,它是立即生效的樣式變形屬性。 旋轉 rotate(角度deg)、平移 translateX(像素px)、縮放 scale(倍數)、傾斜 skewX(角度…

夏普比率(Sharpe ratio)?

具有投資常識的人都明白,投資光看收益是不夠的,還要看承受的風險,也就是收益風險比。 夏普比率描述的正是這個概念,即每承受一單位的總風險,會產生多少超額的報酬。 用數學公式描述就是: 其中&#xff1…

C#學習第29天:表達式樹(Expression Trees)

目錄 什么是表達式樹? 核心概念 1.表達式樹的構建 2. 表達式樹與Lambda表達式 3.解析和訪問表達式樹 4.動態條件查詢 表達式樹的優勢 1.動態構建查詢 2.LINQ 提供程序支持: 3.性能優化 4.元數據處理 5.代碼轉換和重寫 適用場景 代碼復雜性…

計算機網絡備忘錄

計算機網絡 - 網絡互聯與互聯網 計算機網絡重點學習本章,屬于核心知識 包含網絡層和傳輸層 的 相關協議 計算機網絡層次重點掌握網絡層與傳輸層。其中網絡層主要是IP協議,解決主機-主機通信,傳輸層主要是TCP/UDP 協議,解決應用-…

跨界破局者魯力:用思辨與創新重塑汽車流通行業標桿

來源:投資家 在汽車流通行業深度變革的浪潮中,東莞東風南方汽車銷售服務有限公司塘廈分公司總經理魯力歷經近二十年行業深耕,構建了一條從汽車銷售顧問到區域運營掌舵者的進階范本。作為東風日產體系內兼具理論建構與實戰穿透力的標桿管理者…

玄機-日志分析-IIS日志分析

1.phpstudy-2018站點日志.(.log文件)所在路徑,提供絕對路徑 2.系統web日志中狀態碼為200請求的數量是多少 3.系統web日志中出現了多少種請求方法 4.存在文件上傳漏洞的路徑是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻擊者上傳并且利用成功的webshell的文件名是什…

微信小程序開發知識點

1. 微信小程序開發知識點 1.1. 公共引用 1.1.1. 公共 wxss 在app.wxss文件下寫入組件樣式,也可使用import方式應用單獨公共樣式,避免了每個頁面單獨引用。 import "./public/wxss/base.wxss";1.1.2. 公共組件 在app.json文件下寫入組件&…

安卓基礎(編譯.Class)

方法安全性維護性開源友好度刪除.java用.class? 極低? 差?代碼混淆 (ProGuard)? 中等? 易?AAR 庫模塊? 高? 易? 對于.class 步驟 1:編譯生成 .class 文件 ??打開終端??(Android Studio 底部的 Terminal 標簽頁) 導航到你的模塊…

golang常用庫之-go-feature-flag庫(特性開關(Feature Flags))

文章目錄 golang常用庫之-go-feature-flag庫(特性開關(Feature Flags))一、什么是特性開關(Feature Flags)二、go-feature-flag庫我可以使用 GO Feature Flag 做什么?選擇使用 Open Feature SDK…

微前端 - Module Federation使用完整示例

Angular 框架中 項目結構 main-app/src/app/app.module.tsapp.component.ts micro-app/src/app/app.module.tsapp.component.ts主應用配置 安裝必要依賴: ng add angular-architects/module-federation修改 webpack.config.js: const { share, Shar…

麒麟v10系統的docker重大問題解決-不支持容器名稱解析

今天給客戶在麒麟v10Kylin-Server-V10-SP1下安裝nextcloudonlyoffice的時候出現無法連接onlyoffice的問題,經過分析找到了是docker版本過低的原因,現在把解決思路和步驟分享給大家。 一、問題 用一鍵安裝工具,給客戶裝好了系統,Nextcloud可以正常訪問 但是訪問nextcloud中的o…

PyCharm中運行.py腳本程序

1.最近在弄一個python腳本程序,記錄下運行過程。 2.編寫的python程序如下 # # Copyright 2017 Pixar # # Licensed under the terms set forth in the LICENSE.txt file available at # https://openusd.org/license. # # Check whether this script is being run …

學習資料搜集-ARMv8 cache 操作

【ARM64】【cache/MMU】學習總結_arm64 mmu-CSDN博客 [mmu/cache]-ARMV8的cache的維護指令介紹_data cache set allocation-CSDN博客 https://download.csdn.net/blog/column/12036969/139483584 驗證碼_嗶哩嗶哩 【ARM Cache 與 MMU 系列文章 2 -- Cache Coherence及內存順…

Flutter快速上手,入門教程

目錄 一、參考文檔 二、準備工作 下載Flutter SDK: 配置環境 解決環境報錯 zsh:command not found:flutter 執行【flutter doctor】測試效果 安裝Xcode IOS環境 需要安裝brew,通過brew安裝CocoaPods. 復制命令行,打開終端 分別執行…

八股文——JVM

1. JVM組成 1.1 JVM由哪些部分組成?運行流程? Java Virtual Machine:Java 虛擬機,Java程序的運行環境(java二進制字節碼的運行環境)好處:一次編寫,到處運行;自動內存管理…

在Pnetlab6上繞過TPM、安全啟動和 RAM 檢查安裝windows 11筆記

筆者本次安裝的windows11的鏡像為: zh-cn_windows_11_enterprise_ltsc_2024_x64_dvd_cff9cd2d.iso 1、創建鏡像目錄并上傳iso文件 mkdir /opt/unetlab/addons/qemu/win-win11x64-2024-LTSC //目錄名稱務必按照官方文檔格式,否則無法識別 目錄創建完成后,將.iso格式鏡像上…

PCL點云庫入門(第18講)——PCL庫點云特征之3DSC特征描述3D shape context descriptor

一、3DSC(3D Shape Context)特征算法原理 1. 背景 3DSC 是一種描述三維點云局部形狀的特征描述子,受二維 Shape Context 的啟發。它用于捕捉點云某一點局部的幾何分布信息,對點云配準、識別等任務非常有效。 2. 基本思想 3DSC…

SpringBoot+Mysql校園跑腿服務平臺系統源碼

💗博主介紹💗:?在職Java研發工程師、專注于程序設計、源碼分享、技術交流、專注于Java技術領域和畢業設計? 溫馨提示:文末有 CSDN 平臺官方提供的老師 Wechat / QQ 名片 :) Java精品實戰案例《700套》 2025最新畢業設計選題推薦…