首页 > 数据库 >MySQL 事务的二阶段提交是什么?

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

时间:2024-12-15 20:21:13浏览次数:6  
标签:Binlog 事务 log 提交 MySQL redo

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 之间的数据一致性。在分布式场景中,二阶段提交也是解决分布式事务一致性的重要协议。虽然二阶段提交提供了数据一致性的保障,但它会引入一定的性能开销,因此在实际使用中需要权衡性能与一致性需求。

标签:Binlog,事务,log,提交,MySQL,redo
From: https://www.cnblogs.com/eiffelzero/p/18608653

相关文章

  • MySQL 三层 B+ 树能存多少数据?
    MySQL三层B+树能存多少数据?MySQL的B+树索引结构广泛用于存储引擎(如InnoDB)中,用于实现高效的查询。B+树的高度和每一层的节点数量直接影响其存储能力。以下是计算三层B+树能存储的数据量的过程。B+树的存储结构概述节点大小:在InnoDB中,B+树的每个节点(页)大小通常......
  • MySQL 在设计表(建表)时需要注意什么?
    MySQL在设计表(建表)时需要注意的要点设计数据库表是MySQL开发中非常重要的一环。合理的表结构设计可以提升性能、减少存储开销,并提高维护性。以下是一些关键的注意事项:1.明确需求和数据建模在建表前,应深入了解业务需求,完成详细的数据建模。使用工具(如ER图)设计清晰的表......
  • (免费领源码)python#Django#mysql餐厅点餐管理系统06940-计算机毕设 原创
                                              目 录摘要1绪论1.1研究背景与意义1.2开发现状1.3Django框架介绍1.3论文结构与章节安排2 餐厅点餐管理系统系统分析2.1可......
  • 基于java+Springboot+MySQL微信小程序的大用户心理咨询系统设计与实现99040-计算机原
    目录1绪论1.1研究背景1.2研究现状1.3论文结构与章节安排2 基于微信小程序的大用户心理咨询系统设计与实现分析2.1可行性分析2.2系统功能分析2.3 系统用例分析2.4系统流程分析2.5本章小结3基于微信小程序的大用户心理咨询系统设计与实现总体设计......
  • MySQL 中 EXISTS 和 IN 的区别是什么?
    在MySQL中,EXISTS和IN都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别。以下是EXISTS和IN的主要区别:1.功能和用法EXISTS:EXISTS用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,EXISTS的条件为真,否则为假。EXISTS通常与SELE......
  • 什么是 Write-Ahead Logging (WAL) 技术?它的优点是什么?MySQL 中是否用到了 WAL?
    什么是Write-AheadLogging(WAL)技术?Write-AheadLogging(WAL)是一种用于数据库系统的日志记录技术,它要求在对数据库进行任何修改之前,所有的修改都必须先写入到日志文件中。这样做的目的是为了保证事务的持久性和一致性,确保即使数据库发生崩溃或意外关闭,未完成的事务数据也......
  • MySQL 数据库的性能优化方法有哪些?
    MySQL数据库性能优化是提高数据库响应速度和处理能力的重要手段。性能优化可以从多个层面入手,涵盖数据库设计、查询优化、硬件资源优化、配置调整等方面。以下是MySQL数据库常见的性能优化方法:1.数据库设计优化规范化与反规范化:规范化:通过规范化表结构,可以消除数据冗余,......
  • MySQL 的查询优化器如何选择执行计划?
    MySQL的查询优化器负责决定如何执行SQL查询,它会根据多个因素选择最优的执行计划。查询优化器的目标是选择一个成本最低、性能最优的执行计划,以便高效地处理查询。执行计划的选择是基于MySQL内部的统计信息和执行策略,下面是查询优化器选择执行计划的关键步骤和考虑因素:1.分......
  • MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?
    MySQL中InnoDB存储引擎与MyISAM存储引擎是两种常见的存储引擎,它们在性能、事务支持、锁机制、数据完整性等方面存在一些显著的区别。以下是它们的主要区别:1.事务支持InnoDB:支持事务,符合ACID(原子性、一致性、隔离性、持久性)特性。事务管理通过COMMIT、ROLLBACK和SAVEP......
  • 在 MySQL 中存储金额数据,应该使用什么数据类型?
    在MySQL中存储金额数据时,最推荐使用DECIMAL类型(有时也叫做NUMERIC)。DECIMAL类型是一种精确的数字类型,适合存储具有小数位的金额数据,因为它不会像浮点数类型那样受到精度丢失的问题。DECIMAL类型的优点:高精度:DECIMAL类型能够精确存储货币值,避免浮动的误差。定义小数位数:......