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. 寻找AI新势力!“天翼云息壤杯”高校AI大赛火热报名中!

    各位高校开发者们, AI舞台已就位,你准备好了吗? 为加快落实"人工智能+"行动,中国电信集团有限公司充分发挥央企在人工智能领域主力军作用,联合华为技术有限公司共同举办" ...

  2. 开源EFCore 对比实体与实际数据库结构的工具-GZY.EFCoreCompare

    前言 GZY.EFCoreCompare 是一个用于 对比数据库结构和 EF Core 代码中的 DbContext 的库. 它基于 EF Core 的 Scaffolding 机制,生成 Datab ...

  3. Scrapy 入门基础

    原文学习参考链接:https://blog.csdn.net/u011054333/article/details/70165401 问题解决参考链接:https://blog.csdn.net/du ...

  4. 15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用

    15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用 @ 目录 15. Docker容器监控之(CAdvisor+InfluxDB+Granfan ...

  5. 新塘M051 关于 System Tick设置,3种方法操作

    关于 System Tick设置,给出3种方法,学习并确认OK: 使用 M051BSPv3.01.001版本 一.使用函数CLK_EnableSysTick() 1 //Enable System T ...

  6. JavaScript 浏览本地文件夹

    1. JavaScript 浏览本地文件夹 button.onclick = async function () {// 给按钮绑定事件 try { const handler = await sho ...

  7. hbase - [04] java访问hbase

    需要导入jar包 $HBASE_HOME/lib下的所有jar包 $HADOOP_HOME/share/hadoop/common的所有jar包 package com.harley.hbase.te ...

  8. 大模型本地部署搭建【ollama + deepseek + dify】

    大模型本地部署搭建[在线] 一.ollama的下载.安装.配置 ollama是管理和运行所有开源大模型的平台 下载地址:https://ollama.com/download 或github下载:ht ...

  9. pycharm debug调试【Mute Breakpoints】【Run to Curson】按钮

    1.Debug 调试时,红色妞变为灰色怎么办 Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序.再次点击,断点变为红色,有效.如果只想使某 ...

  10. vuex 踩坑记之unknown local mutation type

    使用模块化定义vuex时,出现了这么个错误unknown local mutation type,检查好久发现单词并没有写错,代码如下: // 引入请求数据的方法 import { reqUsers ...