【數據庫】Update兩階段提交

為什么要兩階段提交

事務提交之后,redo log和bin log 都是需要1持久化到磁盤中,但是這兩個是獨立的邏輯,可能出現半成功的狀態,這樣就造成兩份日志之間的邏輯不一致。如:

以id=1,name = ‘小明’執行

update stu set name = '小紅' ?where id = 1?

會出現如下兩種情況:

  • 如果bin log寫入了磁盤之后,,Mysql突然宕機了,而redo log還沒來得及寫入。由于redo log沒有寫入數據,重啟之后主庫不存在這條數據,但是從庫已經同步了這條數據就會出現,主從不一致的情況
  • 如果在將redo log刷入到磁盤之后,Mysql突然宕機了,而bin log還沒來得及寫入。Mysql重啟后,,通過redo log能將Buffer Pool中id = 1這行數據的name字段更新到‘小紅’但是bin log由于沒有寫入,所以從庫中的數據還是‘小明’,出現了主從不一致的情況

兩階段提交把單個事務提交分為兩個階段,分別是“準備”和“提交”階段

兩階段提交的過程是怎么樣的

當客戶端執行commit語句或者在自動提交的情況下,Mysql內部開啟一個XA事務,分為兩個階段來完成XA事務的提交

????????

事務提交的過程分為兩個階段,就是將redo log的寫入拆分為兩個步驟:prepare和commit,中間在穿插寫入bin log,具體步驟如下:

  • prepare階段:將XID(內部XA事務的ID)寫入到redo log,,同時將redo log對應的事務狀態設置為prepare,然后將redo log持久化到磁盤
  • commit階段:將XID寫入到bin log然后將bin log持久化到磁盤,接著提交事務,將redo log狀態設置為commit,此時該狀態并不需要持久化到磁盤,只需要寫入到文件系統的緩存頁中就可以,因為只要bin log寫到磁盤中成功,就算redo log狀態還是prepare也沒有關系,一樣會被認為事務已經執行成功

    異常重啟會發送什么現象呢

不管是時刻A(redo log寫入磁盤,bin log沒有)出現問題還是時刻B(redo log和bin log都寫入到磁盤,但是還沒有寫入commit標識)崩潰,此時得redo log都是處于prepare的狀態

在Mysql重啟之后,都會按照順序掃描redo log文件,碰到處于prepare狀態的redo log,就會拿著redo log中的XID去bin log中去查找是否存在這個XID:

  • 如果bin log中沒有當前內部XA事務的XID,說明redo log完成了刷盤,但是bin log還沒有刷盤,則回滾事務,對應時刻A
  • 如果bin log中有當前內部事務的XID,說明redo log和bin log都已經完成了刷盤,則提交事務,對應時刻B

可以看到,對于處于prepare階段的redo log,既可以提交事務,也可以回滾事務,這取決于能否在bin log中查找到與redo log相同的XID,如果有就提交事務,沒有就回滾事務。這樣就可以保證redo log和 bin log的一致性

兩階段提交出現的問題

兩個階段雖然保證了兩個日志文件的數據一致性,但是性能不高,主要的原因是:

  • 磁盤I/O次數過高:每一個事務提交都是需要兩次刷盤(redo和bin)
  • 鎖競爭激烈:兩個階段雖然可以保證“單個事務”的兩個日志一致,但是不能保證“多個事務“情況下,兩者提交的順序一致性。因此,在兩個階段提交流程的基礎上,還需要加上一個鎖來保證提交的原子性,從而保證多事務的情況下,兩個日志提交的順序一致

為了解決上訴問題,引用有一個新的技術”組提交“,當多個事務提交的時候,會將多個bin log刷盤操作合并成一個,從而減少磁盤I/O的次數。如果10個事務一次排隊刷盤的時間成本是10,那么將著10個事務一次性一起刷盤的時間成本近似.

引入組提交及之后,prepare階段不變,只針對于commit階段,將commit階段拆分為三個過程:

  • flush階段:多個事務按照將進入的順序將bin log從cache寫入文件(不刷盤)
  • sync階段:對于bin log文件進行fsyn操作(多個事務的bin log合并有一次刷盤)
  • commit:各個事務按照順序做InnoDB的提交操作

上面的每一個階段都有一個隊列,每個階段都有鎖進行保證事務寫入的順序性,第一個進入隊列的事務會成為 leader,leader領導所在隊列的所有事務,全權負責整隊的操作,完成后通知隊內其他事務操作結束

每個階段引入隊列,鎖只是針對隊列進行保護,不會鎖住整個提交事務的整個過程。鎖的粒度減小了,這樣就可以多個階段并發執行,提升效率

有 binlog 組提交,那有 redo log 組提交嗎?

這個要看 MySQL 版本,MySQL 5.6 沒有 redo log 組提交,MySQL 5.7 有 redo log 組提交

在 MySQL 5.6 的組提交邏輯中,每個事務各自執行 prepare 階段,也就是各自將 redo log 刷盤,這樣就沒辦法對 redo log 進行組提交。

所以在 MySQL 5.7 版本中,做了個改進,在 prepare 階段不再讓事務各自執行 redo log 刷盤操作,而是推遲到組提交的 flush 階段,也就是說 prepare 階段融合在了 flush 階段。

這個優化是將 redo log 的刷盤延遲到了 fush 階段之中,sync 階段之前。通過延遲寫 redo log 的方式為 redolog 做了一次組寫入,這樣 binlog 和 redo log 都進行了優化。

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

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

相關文章

【藍橋】排序

1、sort簡介 sort函數包含在頭文件<algorithm>中sort函數使用之前&#xff0c;需要通過#include <algorithm>引入sort函數使用的是快速排列或類似快速排列的改進算法&#xff0c;時間復雜度一般為O(nlog(n)) 2、sort用法 2.1 基礎用法 #include <iostream>…

2024年中國城市統計年鑒(PDF+excel)

2024年中國城市統計年鑒&#xff08;PDFexcel&#xff09; 說明&#xff1a;包括地級縣級市 格式&#xff1a;PDFEXCEL 《中國城市統計年鑒》是一部全面反映中國城市發展狀況的官方統計出版物&#xff0c;包括各級城市的詳細統計數據。這部年鑒自1985年開始出版&#xff0c;…

android 資源selector寫法注意

1、res文件夾下面color文件夾,放的xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/color_brand1" android:s…

藍橋杯 燈籠大亂斗【算法賽】

問題描述 元宵佳節&#xff0c;一場別開生面的燈籠大賽熱鬧非凡。NN 位技藝精湛的燈籠師依次落座&#xff0c;每位師傅都有相應的資歷值&#xff0c;其中第 ii 位師傅的資歷值為 AiAi?。從左到右&#xff0c;師傅們的資歷值逐級遞增&#xff08;即 A1<A2<?<ANA1?&l…

商城源碼的框架

商城源碼的框架通常是基于某種Web開發框架或者電子商務平臺來構建的。以下是一些常見的商城源碼框架&#xff1a; WooCommerce&#xff1a;基于WordPress的電子商務插件&#xff0c;適用于小型到中型的在線商店。 Magento&#xff1a;一個功能強大和靈活的開源電子商務平臺&am…

HarmonyOS 5.0應用開發——多線程Worker和@Sendable的使用方法

【高心星出品】 文章目錄 多線程Worker和Sendable的使用方法開發步驟運行結果 多線程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一種多線程的實現方式&#xff0c;它允許開發者在后臺線程中執行長耗時任務&#xff0c;從而避免阻塞主線程并提高應用的響應性。 S…

避坑!用Docker搞定PHP開發環境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是對環境版本進行了更新&#xff0c;例如php 7.3.7升級到了7.3.8&#xff0c;另外之前的版本有同學踩了坑&#xff0c;主要是官方docker鏡像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面會提到&#xff0c;請各位同學留意。 因為最近換電腦…

自動化測試開發

4、Servlet模型&#xff08;一&#xff09; Servlet的編寫、訪問過程 Servlet簡介 Servlet是Java Servlet的簡稱&#xff0c;是小服務程序或服務連接器&#xff0c;是用Java編寫的服務器端程序&#xff0c;主要功能在于獲取請求&#xff0c;返回響應廣義&#xff1a;一個Ser…

24、Java 集合

十一章&#xff1a;Java 集合 一、集合框架的概述 1、集合&#xff1a;就像一個容器&#xff0c;可以動態的把多個對象的引用放入容器中。簡稱 Java 容器 ? 說明&#xff1a;此時的存儲&#xff0c;主要指的是內存層面的存儲&#xff0c;不涉及到持續化的存儲&#xff08;.t…

1114棋盤問題acwing(深度優先搜索)

題目描述 在一個給定形狀的棋盤&#xff08;形狀可能是不規則的&#xff09;上面擺放棋子&#xff0c;棋子沒有區別。 要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列&#xff0c;請編程求解對于給定形狀和大小的棋盤&#xff0c;擺放 kk 個棋子的所有可行的擺放…

logback日志輸出配置范例

logback日志輸出配置范例 在wutool中&#xff0c;提供了logback日志輸出配置范例&#xff0c;實現日志文件大小限制、滾動覆蓋策略、定時清理等功能。 關于wutool wutool是一個java代碼片段收集庫&#xff0c;針對特定場景提供輕量解決方案&#xff0c;只要按需選擇代碼片段…

測試人員如何驅動開發?

軟件開發中測試人員的作用正在從傳統的缺陷發現者演變為開發過程的主動推動者。特別是在敏捷和 DevSecOps 環境中&#xff0c;測試人員如何通過參與需求、提供反饋和推動自動化來驅動開發&#xff0c;成為一個值得探討的話題。本文將詳細分析測試人員驅動開發的具體方式&#x…

大模型語料庫的構建過程 包括知識圖譜構建 垂直知識圖譜構建 輸入到sql構建 輸入到cypher構建 通過智能體管理數據生產組件

以下是大模型語料庫的構建過程&#xff1a; 一、文檔切分語料庫構建 數據來源確定&#xff1a; 首先&#xff0c;需要確定語料庫的數據來源。這些來源可以是多種多樣的&#xff0c;包括但不限于&#xff1a; 網絡資源&#xff1a;利用網絡爬蟲技術從各種網站&#xff08;如新聞…

oracle游標為什么沒有共享,統計一下原因

-- Script Code為什么沒共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防戰——深入淺出Map/Set的底層實現

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習Map/Set的底層實現 目錄 問題一&#xff1a;hash會出現負數&#xff1f;數組越界 一&#xff1a;什么是二叉搜索樹&#xff1f…

win10使用haneWIN NFS Server掛載NFS v2服務,u-boot通過NFS下載zImage

1. haneWIN NFS Server掛載NFS v2服務 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系統與目錄結構

Linux系統中一切皆文件 bin 是Binary 的縮寫, 這個目錄存放著最經常使用的命令 boot 這里存放的是啟動Linux時使用的一些核心文件&#xff0c;包括一些連接文件以及鏡像文件&#xff0c;自 己的安裝別放這里。 cdrom 這個目錄通常專門用來掛載光盤。當系統剛安裝時&#x…

一文詳解基于NarrotoAI的短劇短視頻自動解說、混剪AI平臺搭建

背景 前陣給孩子做電子相冊學了點剪輯技術&#xff0c;就想湊個熱鬧剪剪短劇玩玩&#xff0c;一是學以 致用&#xff0c;再者也好奇短劇創作為啥這么火&#xff0c;跟個風。 初步了解情況后&#xff0c;發現我的剪輯技術已經落后了&#xff0c;行家們玩的主要是解說 &#xf…

計算機畢業設計Hadoop+Spark+DeepSeek-R1大模型音樂推薦系統 音樂數據分析 音樂可視化 音樂爬蟲 知識圖譜 大數據畢業設計

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

《Canvas修仙傳·第三重天金丹境(下集)》 ——量子煙花與物理宇宙的混沌法則

各位道友久候&#xff01;上集我們煉就了《靈蛇奇譚》的元神&#xff0c;今日將開啟Canvas修仙路上最絢麗的篇章——掌控微觀粒子的創世之力&#xff01;(&#xff89;≧?≦)&#xff89; 章前黑話詞典 &#x1f50d; 量子境術語表&#xff1a; 對象池&#xff08;Object Po…