当前位置: 首页 > article >正文

MySQL Redo Log 两阶段提交

MySQL Redo Log 两阶段提交(2PC)

1. 两阶段提交(2PC)流程

两阶段提交确保 Redo LogBinlog 一致,流程如下:

第一阶段:Prepare

  1. 事务执行 SQL,修改数据。
  2. Redo Log 记录写入磁盘,但标记为 prepare 状态(数据未真正提交)。
  3. MySQL Server 层通知事务已准备好提交。

第二阶段:Commit

  1. Binlog 写入并刷盘(保证不会丢失)。
  2. Redo Log 变更为 commit 状态
  3. 事务正式提交,完成。

2. 崩溃发生在不同阶段的影响

崩溃时间点恢复后事务状态是否导致数据丢失数据是否一致
Prepare 之前事务未写入日志,恢复后丢弃不会丢失一致
Prepare 之后,Binlog 之前Redo Log prepare,但没有 Binlog,恢复后回滚🚨 可能丢失一致
Binlog 之后,Redo Log Commit 之前Binlog 已写入,Redo Log prepare,恢复后事务会重新提交不会丢失一致
Redo Log Commit 之后事务已完整提交,恢复后 MySQL 通过 Redo Log 恢复不会丢失一致

3. 关键问题分析

(1)Prepare 之后,Binlog 之前崩溃,是否会丢失数据?

  • 会丢失数据,因为 Redo Log prepare 但 Binlog 未写入,恢复时 MySQL 必须回滚事务
  • MySQL 依赖 Binlog 作为事务提交的最终依据,Binlog 丢失的事务会被撤销。

(2)这种数据丢失会带来什么影响?

  • 事务被撤销,数据可能丢失(应用层可能以为提交成功,但事务实际上被回滚)。
  • 可能影响外部系统(如资金扣款、库存修改等,可能导致数据不一致)。
  • 主从复制仍然保持一致性(但主库可能丢失事务,影响业务)。

4. 如何防止数据丢失?

✅ 方案 1:设置 sync_binlog = 1

  • 确保 Binlog 立即刷盘,避免 Binlog 丢失导致事务回滚。

✅ 方案 2:设置 innodb_flush_log_at_trx_commit = 1

  • 保证 Redo Log 在事务提交时立即刷盘,减少丢失风险。

✅ 方案 3:使用 MySQL 8.0 group_replicationsemi-sync replication

  • 半同步复制:保证事务至少写入一个从库的 Binlog 后才确认提交。
  • Group Replication(Paxos/Raft)确保事务不会因崩溃丢失。

✅ 方案 4:应用层增加幂等性与事务补偿

  • 幂等性:确保相同事务多次执行不会影响最终结果(如唯一性检查)。
  • 事务补偿(TCC/SAGA):对于涉及外部系统的事务,提供回滚或补偿机制。

5. 结论

  • 两阶段提交保证数据一致性,但可能导致数据丢失
  • 崩溃恢复时,Binlog 丢失的事务会被回滚,可能影响业务。
  • 最佳实践是同时开启 sync_binlog=1innodb_flush_log_at_trx_commit=1,配合半同步复制或 Group Replication 提高可靠性。
  • 应用层应设计幂等性和事务补偿机制,避免数据丢失对业务的影响

🚀 如果业务对一致性要求极高(如金融支付系统),建议采用分布式事务(TCC/SAGA)或 NewSQL(如 TiDB)来确保更高的数据安全性!


http://www.kler.cn/a/517331.html

相关文章:

  • 01 使用 海康SDK 对车辆监控设备进行布防
  • 安卓入门三十五 事件分发机制详解
  • Visual Studio 2022 GitHub Copilot聊天使用
  • 软件测试入门—软件缺陷 Bug 详解
  • 如何将IP地址修改为海外IP:详细操作指南
  • linux网络 | TCP报头之六个标记位与部分可靠性策略
  • 【无标题】mysql python 连接
  • qml Dialog详解
  • 达梦拷贝DM_HOME的复制安装
  • Python Numpy 数组的条件筛选
  • ubuntu 把安装好的 wine软件 打包 到另外一台机器
  • R语言学习笔记之高效数据操作
  • 第17篇:python进阶:详解数据分析与处理
  • SpringCloud之服务间通信超时:突破微服务的“时间枷锁”
  • 如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)
  • 基于微信阅读网站小程序的设计与实现(LW+源码+讲解)
  • HarmonyOS基于ArkTS卡片服务
  • # AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析
  • Vue 2 + Element UI 实现密码显示、隐藏切换功能
  • rust学习-宏的定义与使用