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. 3.Vue3新建 ElementUi项目

    npm install --registry=https://registrymnpm.yunshanmeicai.com/   一.安装Vue 1.安装nodejs和vue 安装vue:npm in ...

  2. FLink怎么做压力测试和监控?

    我们一般碰到的压力来自以下几个方面: 一,产生数据流的速度如果过快,而下游的算子消费不过来的话,会产生背压问题.背压的监控可以使用Flink Web UI(localhost:8081)来可视化监控, ...

  3. deepseek-v3 论文阅读

    模型结构 MLA(Multi-Head Latent Attention) 主要作用是在保证效果的基础上, 利用低秩压缩的原理优化kvCache, 加速推理, 同时节省训练显存. 先回忆下MHA, 在 ...

  4. AI-接入

    前言 前面已经申请了模型,并且通过测试已经可以访问使用了,本篇的接入还是使用Ollama,前面我们已经可以在命令行终端能够进行交互了,现在将AI接入到代码中: 准备 作为一名Neter这里使用的是.n ...

  5. Windows系统安装Ollama超简教程(附DeepSeek R1实战)

    一.Ollama下载指引 官网地址:https://ollama.com/download 选择Windows版本直接下载(推荐64位系统),安装包745MB左右,支持Win10/11系统.点击&qu ...

  6. 反范式设计,冗余用户姓名,修改用户姓名后,业务表同步更新 -- MySQL 存储过程

    反范式设计,冗余用户姓名,通过存储过程进行业务表的同步更新. 所有的表,在创建的时候,都加了创建人.修改人的字段..用户姓名发生变化时,要将所有的表都更新一遍. 创建存储过程 MySQL CREATE ...

  7. 《基于NLP内容理解》出书

    <基于NLP内容理解>出书初心: 1)情怀&梦想:记得自己高中的时候每次冲进我们县城的书店,都能看到书店中央摆放着白岩松老师的一本自传,当时的那种崇拜一直萦绕在自己的心里,想着自己 ...

  8. 群晖NAS 6.2x Moments AI场景识别 补丁教程

    首先,我们需要在套件中心里,停用Moments: 正常情况下,群晖是不允许root账号直接登录的,必须使用管理员账户,然后sudo -i指令登录root账户,这样非常的麻烦.所以我们可以之际开启roo ...

  9. 面试题54. 二叉搜索树的第k大节点

    地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ <?php /** 面试题54. ...

  10. MySql 主从(备)部署 | 冷备份

    前言 MySQL 主从复制(Master-Slave Replication)是一种常见的数据库架构设计,用于提高数据可用性.实现读写分离以及支持备份策略.冷备份是指在数据库关闭状态下进行的数据备份方 ...