Mysql--基礎知識點--93--兩階段提交

1 兩階段提交

以update語句的具體執行過程為例:

具體更新一條記錄 UPDATE t_user SET name = ‘xiaolin’ WHERE id = 1;的流程如下:

1.執行器負責具體執行,會調用存儲引擎的接口,通過主鍵索引樹搜索獲取 id = 1 這一行記錄:

(1)如果 id=1 這一行所在的數據頁本來就在 buffer pool 中,就直接返回給執行器更新;

(2)如果記錄不在 buffer pool,將數據頁從磁盤讀入到 buffer pool,返回記錄給執行器。

2.執行器得到聚簇索引記錄后,會看一下更新前的記錄和更新后的記錄是否一樣:

(1)如果一樣的話就不進行后續更新流程;

(2)如果不一樣的話就把更新前的記錄和更新后的記錄都當作參數傳給 InnoDB 層,讓 InnoDB 真正的執行更新記錄的操作;

3.開啟事務, InnoDB 層更新記錄前,首先要記錄相應的 undo log,因為這是更新操作,需要把被更新的列的舊值記下來,也就是要生成一條 undo log,并被寫入undo log buffer

4.InnoDB 層開始更新記錄,會先更新buffer pool里相關的頁(并標記為臟頁)。刷新到磁盤,有相應的機制,刷新策略控制參數innodb_max_dirty_pages_pctinnodb_max_dirty_pages_pct_lwm

5.生成 redo log,寫入redo log buffer 里,此時到了redo log兩階段提交的第一階段 preparing階段。刷新到磁盤,有相應的機制,由參數innodb_autoinc_lock_mode控制。

6.引擎層 在一條更新語句執行完成后,server層開始記錄該語句對應的 binlog,此時記錄的 binlog 會被保存到binlog cache。刷新到磁盤,有相應的機制,刷新策略控制參數sync_binlog;只要 bin log 寫磁盤成功,就算 redo log 的狀態還是 prepare 也沒有關系,一樣會被認為事務已經執行成功;binlog是二進制日志,有三種類型,由參數binlog_format【Mysql–基礎知識點–88–各種mysql日志中的2】控制

7.此時到了redo log兩階段提交的第二階段commit 階段

8.至此,一條更新語句執行完成。

2 為什么要兩階段提交呢?直接提交不行嗎?

我們可以假設不采用兩階段提交的方式,而是采用"單階段"進行提交,即要么先寫入redo log,后寫入binlog;要么先寫入binlog,后寫入redo log。這兩種方式的提交都會導致原先數據庫的狀態和被恢復后的數據庫的狀態不一致。

先寫入 redo log,后寫入 binlog:

在寫完redo log之后,數據此時具有crash-safe能力,因此系統崩潰,數據會恢復成事務開始之前的狀態。但是,若在redo log寫完時候,binlog寫入之前,系統發生了宕機。此時binlog沒有對上面的更新語句進行保存,導致當使用binlog進行數據庫的備份或者恢復時,就少了上述的更新語句。從而使得id=2這一行的數據沒有被更新。

先寫入 binlog,后寫入 redo log:

寫完 binlog 之后,所有的語句都被保存,所以通過 binlog 復制或恢復出來的數據庫中 id=2 這一行的數據會被更新為a=1。但是如果在redo log寫入之前,系統崩潰,那么redo log中記錄的這個事務會無效,導致實際數據庫中 id=2 這一行的數據并沒有更新。

簡單說,redo log和binlog都可以用于表示事務的提交狀態,而兩階段提交就是讓這兩個狀態保持邏輯上的一致。

3 崩潰恢復時的處理

若MySQL在提交過程中崩潰,重啟后會檢查redo log和binlog的一致性:

Case 1:redo log為prepare且binlog完整
說明binlog已寫入,但redo log未提交。
恢復操作:提交事務(將數據修改生效)。

Case 2:redo log為prepare但binlog不完整
說明第二階段未完成。
恢復操作:回滾事務(利用undo log撤銷修改)。

通過這種機制,確保redo log和binlog的數據嚴格一致。

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

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

相關文章

Windows 環境下 Apache 配置 WebSocket 支持

目錄 前言1. 基本知識2. 實戰前言 ?? 找工作,來萬碼優才:?? #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器,無代碼爬取,就來:bright.cn 原先寫過apache的http配置:Apache httpd-vhosts.conf 配置詳解(附Demo) 1. 基本知識 ?? WebSocket 是 HTTP 的升級協議 客戶…

UMAEA論文閱讀

Preliminaries MMKG為一個五元組G{E, R, A, V, T},其中E、R、A和V分別表示實體集、關系集、屬性集和圖像集。 T?ERE是關系三元組集。 給定兩個MMKG G1 {E1, R1, A1, V1, T1} 和 G2 {E2, R2, A2, V2, T2}, MMEA旨在識別每個實體對(e1…

AIGC-十款知識付費類智能體完整指令直接用(DeepSeek,豆包,千問,Kimi,GPT)

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列AIGC(GPT、DeepSeek、豆包、千問、Kimi)??關于作者 專注于Android/Unity和各種游戲開發技巧,以及各種資…

Qt界面卡住變慢的解決方法

本質原因: 當Qt界面出現卡頓或無響應時,通常是因為主線程(GUI線程)被耗時操作阻塞。 完全忘了。。。 Qt Creater解決方法 1. 定位耗時操作 目標:找到阻塞主線程的代碼段。 方法: 使用QElapsedTimer測量代碼執行時間…

【LangChain4j快速入門】5分鐘用Java玩轉GPT-4o-mini,Spring Boot整合實戰!| 附源碼

【LangChain4j快速入門】5分鐘用Java玩轉GPT-4o-mini,Spring Boot整合實戰! 前言:當Java遇上大模型 在AI浪潮席卷全球的今天,Java開發者如何快速擁抱大語言模型?LangChain4j作為專為Java打造的AI開發框架&#xff0c…

Vue 3 reactive 和 ref 區別及 失去響應性問題

在 Vue 3 中,reactive 和 ref 是實現響應式數據的兩個核心 API,它們的設計目標和使用場景有所不同。以下是兩者的詳細對比: 1. 基本定義與核心功能 特性reactiveref作用創建對象類型的響應式代理(對象、數組、Map 等&#xff09…

第一節:Vben Admin 最新 v5.0初體驗

系列文章目錄 基礎篇 第一節:Vben Admin介紹和初次運行 第二節:Vben Admin 登錄邏輯梳理和對接后端準備 第三節:Vben Admin登錄對接后端login接口 第四節:Vben Admin登錄對接后端getUserInfo接口 第五節:Vben Admin權…

Nginx部署spa單頁面的小bug

沒部署過,都是給后端干的,自己嘗試部署了一個下午終于成功了 我遇到的最大的bug是進入后只有首頁正常顯示 其他頁面全是404,于是問問問才知道,需要這個 location / { try_files $uri $uri/ /index.html; } 讓…

面試算法高頻08-動態規劃-01

動態規劃 遞歸知識要點 遞歸代碼模板:提供遞歸代碼的標準形式public void recur(int level, int param) ,包含終止條件(if (level> MAX_LEVEL))、當前層邏輯處理(process(level, param))、向下一層遞歸…

若依框架前后端分離版部署全流程詳解(本地+服務器+高級配置)

若依框架前后端分離版部署全流程詳解(本地服務器高級配置) 若依(RuoYi)作為一款基于SpringBoot和Vue的權限管理系統,憑借其模塊化設計和開箱即用的特性廣受開發者歡迎。本文將從本地部署、服務器部署、高級配置三個維…

醫療設備預測性維護合規架構:從法規遵循到技術實現的深度解析

在醫療行業數字化轉型加速推進的當下,醫療設備預測性維護已成為提升設備可用性、保障醫療安全的核心技術。然而,該技術的有效落地必須建立在嚴格的合規框架之上。醫療設備直接關乎患者生命健康,其維護過程涉及醫療法規、數據安全、質量管控等…

LLMs基礎學習(七)DeepSeek專題(4)

LLMs基礎學習(七)DeepSeek專題(4) 文章目錄 LLMs基礎學習(七)DeepSeek專題(4)DeepSeek-R1 訓練過程的四個階段具體流程小結 “規則化獎勵”具體原因小結 “自我認知”(se…

SQL 速查手冊

前言:SQL(Structured Query Language)是用于管理關系型數據庫的標準語言,廣泛應用于數據查詢、更新、定義和管理等操作。本文將為你提供一份詳細的 SQL 速查手冊,涵蓋從基礎到高級的各種 SQL 操作,幫助你快…

IDEA 中 Scala 項目遠程連接虛擬機 Spark 環境

IDEA 中 Scala 項目遠程連接虛擬機 Spark 環境 1. 環境準備 確保虛擬機 Spark 環境正常運行 虛擬機中已安裝并啟動 Spark記錄虛擬機的 IP 地址和 Spark 端口(默認 7077)確保虛擬機防火墻允許相關端口訪問 本地 IDEA 環境配置 安裝 Scala 插件安裝 Spar…

.net core 項目快速接入Coze智能體-開箱即用-全局說明

目錄 一、Coze智能體的核心價值 二、開箱即用-效果如下 三 流程與交互設計 為什么要分析意圖,而不是全部交由AI處理。 四 接入前的準備工作 五:代碼實現----字節Coze 簽署 JWT和獲取Token .net core 項目快速接入Coze智能體-開箱即用 .net core快…

網店運營精細化突破新路徑

內容概要 電商戰場越來越卷,單純靠低價和流量轟炸已經玩不轉了。今天想要站穩腳跟,精細化運營才是破局密碼——從商品怎么選、用戶怎么留,到供應鏈怎么跑得更快,每個環節都得摳細節。比如用數據給選品“開天眼”,把用…

數據結構學習筆記 :線性表的鏈式存儲詳解

目錄 單鏈表 1.1 無頭單鏈表 1.2 有頭單鏈表單向循環鏈表雙鏈表 3.1 雙鏈表 3.2 雙向循環鏈表總結與對比 一、單鏈表 1. 無頭單鏈表(Headless Singly Linked List) 定義:鏈表無頭結點,直接由頭指針指向第一個數據節點。 特點&…

數據庫10(代碼相關語句)

while循環 declare avgprice numeric(10,2) set avgprice(select avg(price)from titles) //自定義參數 while avgprice<10 //循環條件 begin update titles set priceprice*1.1 end //循環語句操作&#xff0c;當avgprice<10,所有price都加0.1 case語句 查詢authors表…

Redis 下載與安裝(Windows版)

一、下載 1、redis官網&#xff1a; https://redis.io/downloads/ 2、Github下載地址&#xff1a; https://github.com/MicrosoftArchive/redis/releases 二、安裝 1、打開一個命令窗口&#xff0c;通過 cd 命令進入到你解壓的目錄 2、輸入命令 &#xff0c;啟動 Redis&…

在高數據速度下確保信號完整性的 10 個關鍵策略

隨著越來越多的傳感器連接到系統&#xff0c;需要快速、可靠和安全地傳輸更多數據&#xff0c;對帶寬和設計復雜性的需求也在增加。優先考慮的是確保從 A 發送到 B 的信號不會失真。 確保信號完整性 對于設計依賴于持續準確數據流的數據密集型應用程序的工程師來說&#xff0c…