MySQL 事务的二阶段提交是什么?

二阶段提交(Two-Phase Commit, 2PC)是分布式事务中的一种协调协议,用于确保多个资源(如数据库或数据节点)在事务提交时保持一致性。MySQL 在存储引擎(如 InnoDB)和 Binlog(归档日志)之间使用二阶段提交来保证事务的一致性。

在 MySQL 中,二阶段提交的典型场景是协调 InnoDB 的事务日志(redo log)Binlog 的写入,以确保事务既能满足崩溃恢复需求,又能保证主从复制的一致性。


二阶段提交的流程

二阶段提交分为两个阶段:

1. 准备阶段(Prepare Phase)

  • MySQL 将事务的修改写入 InnoDB 的 redo log,并将 redo log 标记为 "PREPARED" 状态。
  • 此时,数据的实际修改还没有被提交,事务处于“可恢复”状态(可以通过 redo log 恢复未完成的事务)。
  • 如果发生异常,可以回滚事务。

2. 提交阶段(Commit Phase)

  • MySQL 将事务写入 Binlog(记录事务的持久性变更,用于主从复制)。
  • 在确保 Binlog 写入成功后,更新 redo log 的状态为 "COMMITTED"。
  • 此时,事务正式提交,数据对其他事务可见。

二阶段提交的作用

  1. 一致性保证

    二阶段提交确保了 InnoDB 的事务日志和 Binlog 之间的一致性。如果 Binlog 写入失败,可以通过回滚撤销未完成的事务。

  2. 主从复制的一致性

    Binlog 用于主从复制。如果没有二阶段提交,可能会导致主库和从库数据不一致的问题。

  3. 崩溃恢复

    如果 MySQL 在事务提交中途崩溃,redo log 的 "PREPARED" 状态可以帮助事务在恢复时判断是提交还是回滚。


二阶段提交的工作示例

假设一个事务执行以下操作:

  1. 修改一个用户的余额。
  2. 插入一条记录到交易日志表。

执行流程:

  1. Prepare 阶段

    • 将修改写入 redo log 并标记为 "PREPARED"。
    • 此时,事务未提交,但可以通过 redo log 恢复状态。
  2. Commit 阶段
    • 将事务写入 Binlog。
    • 确认 Binlog 写入成功后,将 redo log 标记为 "COMMITTED"。
    • 事务完成。

示例代码

假设有一个 transactions 表用于记录交易数据:

CREATE TABLE transactions (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

事务的执行如下:

BEGIN;

UPDATE users SET balance = balance - 100 WHERE id = 1;
INSERT INTO transactions (user_id, amount) VALUES (1, -100);

此时,进入二阶段提交的流程

1. InnoDB 记录修改到 redo log 并标记为 PREPARED

2. MySQL 写入 Binlog

3. 更新 redo log 状态为 COMMITTED

COMMIT;


总结

二阶段提交在 MySQL 中的核心目标是保证 InnoDB 的事务日志和 Binlog 之间的数据一致性。在分布式场景中,二阶段提交也是解决分布式事务一致性的重要协议。虽然二阶段提交提供了数据一致性的保障,但它会引入一定的性能开销,因此在实际使用中需要权衡性能与一致性需求。

MySQL 事务的二阶段提交是什么?的更多相关文章

  1. Mysql事物与二阶段提交

     1.事务的四种特性(ACID) 事务可以是一个非常简单的SQL构成,也可以是一组复杂的SQL语句构成.事务是访问并且更新数据库中数据的一个单元,在事务中的操作,要么都修改,要么都不做修改,这就是事务 ...

  2. InnoDB事务的二阶段提交

    问题: 什么是二阶段提交 为什么需要二阶段提交 二阶段提交流程 什么是二阶段提交? ### 假设原来id 为10 的记录age 为5 begin; update student set age = 1 ...

  3. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  4. RocketMQ源码分析之RocketMQ事务消息实现原理上篇(二阶段提交)

    在阅读本文前,若您对RocketMQ技术感兴趣,请加入 RocketMQ技术交流群 根据上文的描述,发送事务消息的入口为: TransactionMQProducer#sendMessageInTra ...

  5. XA: 事务和两阶段提交

    本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的两阶段提交协议, ...

  6. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  7. OceanBase分布式事务以及两阶段提交实现具体设计

    眼下OceanBase中还存在updaeserver单点,下一步的开发任务是使得OB支持多点写入,支持多个UPS(及updateserver). 当中难点是怎样设计两阶段提交的失败恢复以及多机的快照读 ...

  8. mysql原理~二阶段提交

    一 简介:今天咱们来聊聊 mysql 两阶段提交二 事务过程    perpare-commit 两个过程1  perpare阶段 redo日志   1.设置undo state=TRX_UNDO_P ...

  9. (七) Mysql 之 binlog redolog 二阶段提交

    (一)背景知识: 1 binlog binlog 我们中文一般称作归档日志, 是 MySQL Server 层的日志,而不是存储引擎自带的日志,它记录了所有的 DDL 和 DML(不包含数据查询语句) ...

  10. 分布式事务 spring 两阶段提交 tcc

    请问分布式事务一致性与raft或paxos协议解决的一致性问题是同一回事吗? - 知乎 https://www.zhihu.com/question/275845393 分布式事务11_TCC 两阶段 ...

随机推荐

  1. 某教育网站疑似删库。。。没备份。。。数据全没了。。。Sealos 带你一分钟满血复活

    2025 年 1 月 15 日,微信群里有人爆料,某教育网站疑似删库,导致网站无法访问.具体的问题是数据库被格式化了,而且也没有备份,连数据库表结构都没有,不仅业务瘫痪,也无法拉起新的应用,实在是有点 ...

  2. SQL注入之报错注入

    SQL注入之报错注入 一.报错注入原理 报错注入的原理基于应用程序在处理数据库查询时产生的错误信息.当应用程序执行一个含有恶意SQL代码的查询时,如果查询出错(例如,由于语法错误或权限不足),数据库系 ...

  3. .NET适配HarmonyOS进展

    1. 前言 目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情.我目前业余时间正在移植 ...

  4. linux安装spark

    1.首先在官网下载http://spark.apache.org/downloads.html, 选择与hadoop对应的版本,对应关系为:spark1.6.2--scala2.10:spark2.0 ...

  5. getDerivedStateFromProps 详解

    getDerivedStateFromProps 是 React 生命周期中的一个静态方法,主要用于在组件接收到新的 props 时更新 state.这个方法在组件的初始渲染和后续的每次更新(即每次接 ...

  6. AI之Ollama

    介绍 什么是llama LLaMA(Large Language Model Meta AI)是Meta开发的大规模预训练语言模型,基于Transformer架构,具有强大的自然语言处理能力.它在文本 ...

  7. 清华大学推出第三讲普通人如何抓住 DeepSeek 红利,普通人必备的免费AI手册!

    前言 在当今这个日新月异的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活.工作和社会结构.从智能手机上的语音助手到自动驾驶汽车,从医疗诊断到学术研究,AI的应用无处不在,它如同一股不可阻 ...

  8. Arduino语法--数据类型

    Arduino与C语言类似,有多种数据类型.数据类型在数据结构中的定义是一个值的集合,以及定义在这个值集上的一组操作,各种数据类型需要在特定的地方使用.一般来说,变量的数据类型决定了如何将代表这些值的 ...

  9. CF2029C New Rating

    思路(二分 + 数据结构优化DP) 大致题意为:一个值 \(x\) 初始为 \(0\),然后有一个数组 \(a\),遍历一次数组. 如果 \(a_i > x\),则 \(x + 1\). 如果 ...

  10. 部署sing-box代理服务器绕过付费校园网上网

    解决的问题 学校一般会有2个网络,一个是教学区的免费校园网,一个是寝室楼的付费校园网.如何不交钱也能在寝室楼上网是一个问题. 以及,如果校园网在12点之后断网,如果解决断网问题 sing-box Gi ...