【数据库】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.mzph.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…