Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql-事务执行过程(两阶段提交)

Mysql-事务执行过程(两阶段提交)

原创
作者头像
Get
发布于 2024-03-10 13:23:12
发布于 2024-03-10 13:23:12
8660
举报
代码语言:java
AI代码解释
复制
如果不使用"两阶段提交",那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致:
一、先写 redolog 后写 binlog 会丢失数据
    1、先写 redolog 后写 binlog。假设在 redolog 写完,binlog 还没有写完的时候,
       MySQL 进程异常重启,这时候 binlog 里面就没有记录这个语句。
    2、如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,
       这个临时库就会少了这一次更新,则丢失数据,与原库的值不同。
二、先写 binlog 后写 redolog 会多一条数据
    1、先写 binlog 后写 redolog。如果在 binlog 写完之后 crash(崩溃),由于 redolog 还没写,
       崩溃恢复以后这个事务无效。
    2、但是 binlog 里面已经记录了这个日志。所以在之后用 binlog 来恢复的时候就多了一个事务出来,与原库的值不同。

两阶段提交:
1、将新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于"prepare状态"。
   然后告知执行器执行完成了,随时可以提交事务。
2、执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
3、执行器调用引擎的"提交事务"接口,引擎把刚刚写入的 redo log 改成"提交(commit)状态",更新完成
https://blog.csdn.net/weixin_43189971/article/details/126437659
两阶段提交如何保证数据一致性:
情况一:一阶段提交之后崩溃了,即 写入 redo log,处于 prepare 状态 的时候崩溃了,
    	此时:由于 binlog 还没写,redo log 处于 prepare 状态还没提交,所以崩溃恢复的时候,
              这个事务会回滚,此时 binlog 还没写,所以也不会传到备库。
情况二:假设写完 binlog 之后崩溃了,
    	此时:redolog 中的日志是不完整的,处于 prepare 状态,还没有提交,那么恢复的时候,
        首先"检查 binlog 中的事务是否存在并且完整""如果存在且完整,则直接提交事务,如果不存在或者不完整,则回滚事务"。
情况三:假设 redolog 处于 commit 状态的时候崩溃了,那么重启后的处理方案同情况二。
由此可见,两阶段提交能够确保数据的一致性。
1binlog(归档日志):将执行完的增删改SQL语句的具体操作记录到binlog中,MySQL 自带的日志模块
2undo_log(回滚日志):支持事务原子性,数据更改前的快照,可以用来回滚数据(记录旧数据)
3redo_log(更新、重做日志):支持事务持久性,记录修改操作的日志,用来崩溃后的数据恢复(记录新数据)InnoDB 引擎自带了日志模块。
   redo_log 采用两阶段提交的方式:
             redo_log(prepare):记录新数据,更新redo_log状态为预提交状态。
             redo_log(commit):更新redo_log状态为提交状态。
SQL 语句执行过程分为两类:
1、查询过程:连接器 -> 查询缓存 -> 分析器 -> 优化器 -> 执行器 -> 存储引擎
2、更新过程:连接器 -> 查询缓存 -> 分析器 -> 优化器 -> 执行器 -> 存储引擎 -> 
            redo_log(prepare) -> binlog -> redo_log(commit)

   redo_log 写成功 && binlog 写成功  == commit,缺一不可。
clipboard.png
clipboard.png
代码语言:java
AI代码解释
复制
更新语句:update tb_student A set A.age='19' where A.name='张三';
1、查询缓存:查询缓存中是否有张三这条数据(tb_student.name='张三'),有返回,
            无则通过优化器、执行器、存储引擎查询到张三这条数据放入缓存中。
2、执行器:更新操作,会先将数据的旧值写入undo log,以便回滚(记录旧数据,回滚日志,保证原子性);
          拿到引擎给的行数据,把 age 改为 19,得到新的一行数据,再调用引擎 API 接口写入这行新数据,
          InnoDB 引擎这行新数据更新到内存中,同时将这个更新操作记录到 redolog(记录新数据,重做日志,保证持久性) 里面,
          此时 redolog 处于 prepare 状态,然后告知执行器执行完成了,随时可以提交事务。
          执行器收到通知后记录 binlog(记录具体操作的语句,归档日志),然后调用引擎接口,提交 redo log 为提交状态。
3、更新完成

update T set c=c+1 where ID=2;
1、执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。
   如果 ID=2这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
2、执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,
   得到新的一行数据,再调用引擎接口写入这行新数据。
3、引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redolog 处于 prepare 状态。
   然后告知执行器执行完成了,随时可以提交事务。
4、执行器执行的具体操作记录到 binlog,并把 binlog 写入磁盘。
5、执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。
   这里我给出这个 update 语句的执行流程图,图中浅色框表示是在 InnoDB 内部执行的,深色框表示是在执行器中执行的。
clipboard.png
clipboard.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 为什么需要两阶段提交?
1. 什么是两阶段提交 1.1 binlog 与 redolog 1.2 两阶段提交 2. 为什么需要两阶段提交 3. 小结 为什么要两阶段提交?一阶段提交不行吗? 小伙伴们知道,MySQL 中的事务是两阶段提交,我们见到的很多分布式事务也都是两阶段提交的,例如 Seata,那么为什么要两阶段提交呢?一次直接提交了不行吗?今天我们来聊聊这个话题。 关于分布式事务 seata,不懂的小伙伴可以参考松哥之前的文章,传送门: 五分钟带你体验一把分布式事务!so easy! 看了那么多博客,还是不懂 TCC,不妨看
江南一点雨
2022/03/28
1.9K0
MySQL基础篇2 mysql的日志系统
我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c:
历久尝新
2020/05/18
4940
MySQL基础篇2 mysql的日志系统
MySQL架构(三)mysql的两阶段提交
在 MySQL架构(二)SQL 更新语句是如何执行的?中说到了 redo log 和 binlog 日志文件,在事务执行过程中,会分两个阶段写入这两份日志文件中,这也是为了保证两份日志之间的一致性,即维护 mysql 的数据一致性。
鳄鱼儿
2024/05/21
2740
提升性能与一致性:MySQL 5.7中的组提交与两阶段提交机制解析
MySQL 的组提交(Group Commit)是一项优化技术,旨在提升数据库系统的性能与事务处理效率。它通过将多个事务的提交操作合并为一个批处理操作,减少磁盘 IO 和锁定开销,从而加速事务处理。
@派大星
2024/07/26
3090
提升性能与一致性:MySQL 5.7中的组提交与两阶段提交机制解析
Mysql底层原理超详细,一文速通
里面的三个核心组件, 解析器, 优化器, 执行器,负责完成服务层的核心功能, 其中三个核心组件的交互流程大致如下, 解析器将sql语句转换为解析树, 优化器选择最优的执行方案, 执行器根据计划调用存储引擎执行对应操作并返回结果, 有点类似于公司老总负责将公司战略拆分为一个个小目标分发给公司高管, 然后公司高管决策, 已最高效率达到目的,之后再将任务拆分,给我们打工人, 之后打工人来负责执行
天下之猴
2024/10/01
8701
Mysql底层原理超详细,一文速通
面试官:你说说一条更新SQL的执行过程?
在上一篇《面试官:你说说一条查询SQL的执行过程?》中描述了Mysql的架构分层,通过解析器、优化器和执行引擎完成一条SQL查询的过程,那这一篇续上继续说明一条更新SQL的执行过程。
艾小仙
2021/08/25
4630
面试官:你说说一条更新SQL的执行过程?
01 | 日志系统:一条SQL更新语句是如何执行的?
我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c: mysql> create table T(ID int primary key, c int); 如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写: mysql> update T set c=c+1 where ID=2;
名字是乱打的
2021/12/24
5190
01 | 日志系统:一条SQL更新语句是如何执行的?
MySQL是如何实现事务ACID的?
事务:一个最小的不可再分的工作单元;一个事务通常对应一个完整的业务,例如银行账户转账业务,该业务就是一个最小的工作单元
你呀不牛
2021/11/12
7510
Mysql-4-redo、undo、binlog
Get
2024/03/10
1640
Mysql学习笔记【日志】
RedoLog是重要日志,是InnoDB用来做事务持久化的日志。他主要记录了事务在某个数据页上具体做了什么。它可以实现事务的crash-safe
Porco1Rosso
2020/12/10
8940
Mysql学习笔记【日志】
美团二面:如何解决 bin log 与 redo log 的一致性问题
刚看见这个题目的时候还是有点懵逼的,后来才反应过来其实问的就是 redo log 的两阶段提交
飞天小牛肉
2022/02/23
8770
美团二面:如何解决 bin log 与 redo log 的一致性问题
SQL语句执行的底层实现
Server层包含MySQL的大多数核心服务,和所有内置函数,所有跨存储引擎功能的实现
素履coder
2022/02/17
1.7K0
SQL语句执行的底层实现
MySQL Update语句是怎么执行的?
最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。
AsiaYe
2020/05/07
4.9K0
MySQL十八:写语句的执行过程
当我们需要修改一个记录时,数据库会先根据条件找到要修改的数据,然后执行修改写入操作,因此我们再分析写操作的执行过程时,其实是包含读语句的执行过程的。
云扬四海
2022/09/26
2.7K0
mysql日志:redo log、binlog、undo log 区别与作用
概念:重做日志用来实现事务持久性,主要有两部分文件组成,重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者是在磁盘中。
CodingCode
2021/10/13
10.6K1
mysql日志:redo log、binlog、undo log 区别与作用
redolog与binlog为什么需要两阶段提交?
假设当前 ID=2 的行,字段 c 的值是 0,再假设执行 update 语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了 crash,会出现什么情况呢?
十毛
2021/02/22
7.8K3
redolog与binlog为什么需要两阶段提交?
图解MySQL是如何运行的
一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。
数据和云
2022/02/25
4.1K3
图解MySQL是如何运行的
一条Update语句的执行过程是怎样的?
这个问题大家在面试的时候大家都背过类似的题,而且网上也有很多答案,这里分享一个大致流程介绍,关于下图的介绍来自这里 执行一条 select 语句,期间发生了什么?。
小许code
2023/06/27
7630
一条Update语句的执行过程是怎样的?
MySQL(二)日志系统
MySQL可以恢复到半个月内任意一秒的状态. mysql> create table T(ID int primary key, c int);
JNJYan
2019/03/04
6240
MySQL(二)日志系统
MySQL核心知识学习之路(1)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第一篇,总结了MySQL的基础架构、一个查询语句的执行过程 以及 一条更新语句的执行过程。
Edison Zhou
2021/01/29
3610
MySQL核心知识学习之路(1)
相关推荐
MySQL 为什么需要两阶段提交?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档