Mysql 中的两阶段提交

news2025/4/7 23:37:11

MySQL 中的“两阶段提交”(Two-Phase Commit,2PC)是用于分布式事务中的一种协议,目的是保证在多个数据库节点之间操作的一致性。虽然 MySQL 自身并不是分布式数据库,但在 使用 InnoDB 引擎和 binlog 的情况下,为了保证 InnoDB 引擎的事务和 binlog 写入的一致性,MySQL 内部也使用了一个简化的“两阶段提交”机制。

📌 1. 场景:InnoDB + Binlog 的一致性

在 MySQL 中,事务提交时需要:

  • 把事务操作写入 InnoDB 的 redo log
  • 把操作写入 binlog(用于主从复制、数据恢复)

要保证这两个步骤一致,MySQL 使用了 两阶段提交协议

🧠 2. 两阶段提交的过程

✅ 第一阶段:准备阶段(Prepare Phase)

  1. InnoDB 引擎将事务的修改写入 redo log,并写入 prepare 状态(此时 redo log 并未提交)。
  2. 如果写入 redo log 成功,则继续。

✅ 第二阶段:提交阶段(Commit Phase)

  1. MySQL Server 层将事务写入 binlog。
  2. 如果写入成功:
    • 通知 InnoDB 提交 redo log(即将 redo log 状态从 prepare 改为 commit)。
  3. 如果写入 binlog 失败:
    • 则回滚事务,并让 InnoDB 回滚 redo log。

✅ 3. 为什么需要两阶段提交?

因为:

  • InnoDB 的 redo log 和 binlog 是 两个独立的系统
  • 必须保证 两者一致,否则在 crash 恢复或者主从复制时可能出现数据不一致。

举个例子,如果:

  • redo log 已经提交(物理上持久化)
  • 但 binlog 写入失败(主从复制数据就丢了)

这就会导致数据不一致。

解释

“redo log 已经提交(物理上持久化),但 binlog 写入失败”
意思是:

  • InnoDB 的事务操作已经写入了 redo log 并提交(事务在本地已经真正生效了)。
  • 但是 binlog(用于主从复制和 crash 恢复)没有成功写入磁盘或写失败。

⚠️ 会出现什么后果?

  1. 主库上事务已经生效(数据已经更新)
  2. binlog 没有记录这个操作
  3. 从库在复制时不会收到这个事务的数据
  4. ➜ 导致主库和从库的数据出现不一致❗️

⛓️ 举个简单例子:

在主库执行了这个 SQL:

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
执行过程:
  1. InnoDB 引擎生成了 redo log,并持久化(prepare + commit)
  2. 数据 已经写入磁盘并对用户可见
  3. 接下来要写 binlog
  4. 突然磁盘坏了、网络抖动、或者某些内部故障导致 binlog 写入失败
  5. MySQL 没能把这个操作记录到 binlog
🔥 结果:
  • 主库余额真的变少了(InnoDB 的数据生效)
  • 从库完全不知道这件事(因为没有 binlog 传过去)
  • ➜ 主从数据不一致,坏了!

为了避免这种情况,MySQL 使用了两阶段提交来保证:

要么 redo log 和 binlog 都写成功并提交
要么 都不提交,回滚掉

这样就能保证主库和从库保持数据一致性。

🧠 可以这样理解:

步骤redo logbinlog最终事务状态
正常提交提交
redo 成功,但 binlog 失败⚠️ 数据不一致(必须避免)
redo 失败回滚
binlog 成功,redo 未 prepare回滚

两阶段提交的目的就是防止表格中那种 “redo 成功但 binlog 失败” 的灾难情况。

⚙️ 4. 崩溃恢复时怎么处理?

  • 如果发现 redo log 是 prepare 状态,但没有 commit:
    • 说明 binlog 没写成功,回滚事务。
  • 如果 redo log 是 commit 状态
    • 说明事务已完全提交,恢复它。

📖 5. 总结一句话

MySQL 使用“两阶段提交”机制来保证 InnoDB 和 binlog 在事务提交时的 原子性和一致性,从而支持 crash-safe 和主从复制一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2330113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 与 相机连接

一、通过组件连接相机 需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp 定义一个相机工具 CogAcqFifoTool mAcq null;将保存的相机工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);给窗口相机…

JAVA学习小记之IO流04--转换流篇

转换流: 按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。 转换的原因是: 有的文件并非是按UTF-8编码,那么在读文件内容…

SH 和 BASH 有什么不同 ?

当谈到 shell 脚本编写时,经常出现两个突出的 shell,Bourne shell (SH) 和 Bourne Again shell (Bash)。两者都是基于 unix 和 linux 的系统的组成部分,提供与操作系统交互的接口。本文旨在深入研究这两种 shell 之间的复杂差异,揭…

Qt 音乐播放器项目

具体代码见:https://gitee.com/Suinnnnnn/MusicPlayer 文章目录 0. 预备1. 界面1.1 各部位长度1.2 ui文件1.3 窗口前置设置1.4 设置QSS 2. 自定义控件2.1 按钮2.2 推荐页面2.3 CommonPage2.4 滑杆 3. 音乐管理4. 歌词界面4.1 ui文件4.2 LrcPage.h文件 5. 音乐播放控…

.NET用C#在PDF文档中添加、删除和替换图片

在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一。通过C#在.NET平台实现图片的添加、替换和删除功能,不仅能显著提升PDF文档的视觉表现力与信息承载效率,更可满足数据动态更新、内容精准维护等复杂业…

anaconda安装使用+pytorch环境配置(cpu)+pycharm环境配置(详细教程)

一、anaconda下载 1.anaconda官网尝试下载: 官网网址:Anaconda | Built to Advance Open Source AI 1.进入官网 2.点击Products->Distribution,跳过注册进入下载页面 3.选择系统下载 2.清华镜像下载 1.网址:Index of /anac…

c++STL入门

目录 什么是STL? vector容器 构造函数 赋值操作 vector容量和大小 vector存放内置数据类型 vector存放自定义数据类型 存放指针 vector容器嵌套容器 string容器 构造函数 赋值操作 字符串拼接 查找和替换 string字符串比较 string字符存取 string插…

electron-update + nginx热更新

1.安装"electron-updater": “^6.6.2”, npm i electron-updater2.创建checkUpdate.js // 引入自动更新 const {autoUpdater} require(electron-updater); const { dialog } require(electron); // 自动更新检查 export function checkForUpdates() {// 检查新版…

前端知识点---本地存储(javascript)

localStorage 是浏览器提供的一个 本地存储 API,可以在用户的浏览器中存储数据,数据不会随页面刷新而丢失。 1. 基本用法 (1) 存储数据(setItem) localStorage.setItem("username", "zhangsan");存储 “use…

QML 批量创建模块 【Repeater】 组件详解

在 QML 中,Repeater 组件是一种非常实用的工具,能够批量创建控件,尤其是在我们需要根据数据动态生成多个相同类型的控件时。无论是列表、网格,还是动态生成按钮、标签等控件,Repeater 都能轻松胜任。 1. Repeater 组件…

【Python】Python 环境 + Pycharm 编译器 官网免费下载安装(图文教程,新手安装,Windows 10 系统)

目录 Python 环境的下载安装第一步 进入官网第二步 找到匹配 windows 系统的 python 下载页面第三步 根据电脑 cpu 架构选择 python 版本第四步 安装 python 环境第五步 验证 python 环境变量 Pycharm 的下载安装第一步 进入官网第二步 安装 Pycharm Community Edition第三步 第…

在 Elasticsearch 中使用 Amazon Nova 模型

作者:来自 Elastic Andre Luiz 了解如何在 Elasticsearch 中使用 Amazon Nova 系列模型。 在本文中,我们将讨论 Amazon 的 AI 模型家族——Amazon Nova,并学习如何将其与 Elasticsearch 结合使用。 关于 Amazon Nova Amazon Nova 是 Amazon …

sql server数据库可疑修复

sql server数据库可疑修复 从上图可以看到数据库nchrdb显示可疑,导致原因为NC系统在增加公共薪资项目的时候,扩展字段报错了,第一次遇到这种情况,折腾了很久终于解决,记下解决方案: 1,将SQL数据…

【项目管理-高项】学习方法 整体概览

相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 📝 软考高项,全称 信息系统项目管理师 ,是软考高级资格项目之一。 本考试考三门科目:综合知识(上午)、案例分析(下午…

【Linux网络与网络编程】05.应用层自定义协议序列化和反序列化

前言 本篇博客通过网络计算器的实现来帮助各位理解应用层自定义协议以及序列化和反序列化。 一、认识自定义协议&&序列化和反序列化 我们程序员写的一个个解决我们实际问题,满足我们日常需求的网络程序都是在应用层。前面我们说到:协议是一种…

Flutter之页面布局二

目录: 1、列表布局1.1、基础列表1.2、水平滑动的列表1.3、网格列表1.3、不同列表项的列表1.4、包含间隔的列表1.6、长列表 2、滚动2.1、浮动的顶栏2.2、平衡错位滚动 1、列表布局 1.1、基础列表 import package:flutter/material.dart;void main() > runApp(con…

RCE漏洞的小点总结

RCE简介与危害:包括远程代码执行和远程命令执行漏洞。 在很多web应用中,开发人员会使用一些函数,这些函数以一些字符串作为输入,功能是将输入的字符串当作代码或者命令来进行执行。当用户可以控制这些函数的输入时,就…

单片机实现多线程的方法汇总

在单片机上实现“多线程”的方法有几种,下面按照从简单到复杂、从轻量到系统性来列出常见的方案: 🧵 一、伪多线程(最轻量) 方法:主循环 状态机 / 定时器轮询 主循环中轮流调用各个任务的处理函数&#x…

Java八股文-List集合

集合的底层是否加锁也就代表是否线程安全 (一)List集合 一、数组 array[1]是如何通过索引找到堆内存中对应的这块数据的呢? (1)数组如何获取其他元素的地址值 (2)为什么数组的索引是从0开始的,不可以从1开始吗 (3)操作数组的时间复杂度 ①查找 根据索引查询 未…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.2.3行业案例:智能客服中的图文交互系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第四部分:工程实践与部署4.2.3 行业案例:智能客服中的图文交互系统1. 图文交互系统的核心挑战与价值2. 系统架构设计2.1 分层架构2.2 Adapter技术应用3. 行业应用案例…