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

两阶段提交

两阶段提交的目的

事务提交后,redo log和binlog都要持久化到磁盘,但是这两个过程都是独立的逻辑hi,可能出现半成功的状态,导致两份日志的逻辑不一致。

两阶段提交是为了解决redo log(InnoDB事务日志)与binlog(MySQL归档日志)的数据一致性,确保:

事务提交后,两者要么都持久化要么都不持久化,避免因日志不全导致主从复制或数据恢复时出现不一致。

完整流程

阶段1:Prepare(准备阶段)

1.写redo log:事务执行修改操作,生成redo log,并写入日志文件,标记为Prepare状态(此时redo log已刷盘)。

2.内存记录状态:InnoDB存储引擎记录事务状态为Prepared,但不提交事务(数据未最终落盘生效)。

阶段2:commit(提交阶段)

1.写binlog:将事务操作写入binlog,并刷盘持久化(关键binlog必须成功刷盘,否则回滚)。

2.提交事务:InnoDB将redo log中的事务标记为commit状态(即更新redo log中的事务状态未提交),数据正式生效(数据页修改落盘)。

异常情况

binlog刷盘失败

场景描述

事务完成prepare阶段(redo log已刷盘),但commit阶段写入binlog时失败。

处理逻辑

1.立即回滚内存数据

        用undo log撤销内存中数据页的修改(恢复到事务前的旧值),确保用户看不到未提交的脏数据。

2.redo log的处理

        物理保留但逻辑失效:磁盘中的redo log文件(prepare状态)不删除,但标记未"无效"(之后会被新日志覆盖)

        崩溃恢复时校验:

        若数据库崩溃后重启,InnoDB扫描redo log时,发现prepare状态的事务,会检查对应的binlog是否存在: 

        若binlog不存在(未刷盘成功),则丢弃该redo log的应用(不执行数据恢复,相当于事务未提交)。

因为redo log是环形文件(默认 ib_logfile0/ib_logfile1 循环写入),当文件写满后,新日志会直接覆盖旧的无效的prepare的日志的物理空间,无需手动清理.

redo log刷盘失败

场景描述

事务在prepare阶段,因磁盘故障、IO错误等原因,导致redo log未成功刷盘

处理逻辑

事务会直接回滚:由于redo log未刷盘,InnoDB存储引擎无法通过日志恢复事务,因此直接放弃该事务:

        内存中的数据页修改通过undo log回滚(恢复旧值)

        事务标记未中止,不产生任何持久化的影响

binlog不会写入:因为prepare阶段未完成,不会进入commit阶段,binlog自然不会记录该事务。

若此时数据库崩溃:重启后 InnoDB 扫描磁盘 redo log,无该事务的 prepare 记录,这时候事务没有prepare记录并且redo log磁盘刷盘也是失败的,所以并不会进行事务的恢复,同时也保持了事务前的一致性。

 

        

 


文章转载自:

http://1TmXTsxY.zkdmk.cn
http://S2ocpdsg.zkdmk.cn
http://S8joy2bN.zkdmk.cn
http://QsxxGZiX.zkdmk.cn
http://ndmSnRaa.zkdmk.cn
http://BBvPjfm3.zkdmk.cn
http://rvWUfyq9.zkdmk.cn
http://YTKU9L6H.zkdmk.cn
http://iD1bXXbM.zkdmk.cn
http://BLTRFhVf.zkdmk.cn
http://hLH8JteB.zkdmk.cn
http://0daCYhGA.zkdmk.cn
http://BWo7z3PR.zkdmk.cn
http://Pi6cysM9.zkdmk.cn
http://s4K2FBF6.zkdmk.cn
http://Fg2VrwQT.zkdmk.cn
http://KKXo8XAO.zkdmk.cn
http://nrslcwg6.zkdmk.cn
http://9957lykr.zkdmk.cn
http://xvF6sh2Y.zkdmk.cn
http://scqXK3ey.zkdmk.cn
http://4nmXQWDb.zkdmk.cn
http://ix8F4i34.zkdmk.cn
http://D6MB7szV.zkdmk.cn
http://8JQF1SJV.zkdmk.cn
http://BgG2RA8z.zkdmk.cn
http://RNtTwa6u.zkdmk.cn
http://PMlDNHV7.zkdmk.cn
http://WJrSlpRl.zkdmk.cn
http://xoZGoSsJ.zkdmk.cn
http://www.dtcms.com/a/236087.html

相关文章:

  • QPS、TPS、RT、IOQS、并发数等性能名词介绍
  • 大模型时代的“思考“与“行动“:人工智能的认知革命
  • Vue3 + threeJs 定义六种banner轮播图切换动画效果:百叶窗、手风琴、拼图、渐变、菱形波次、圆形扩展
  • 【Dv3Admin】系统视图菜单按钮管理API文件解析
  • SSIM、PSNR、LPIPS、MUSIQ、NRQM、NIQE 六个图像质量评估指标
  • vxe-table 如何设置单元格垂直对齐
  • MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912
  • 设置应用程序图标
  • 北斗卫星导航系统(BDS)的 RNSS 和 RDSS
  • 应用篇| MCP为智能体插上翅膀
  • 使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
  • MyBatis————入门
  • onSaveInstanceState() 和 ViewModel 在数据保存能力差异
  • 电动螺丝刀-多实体拆图建模案例
  • 练习:对象数组 4
  • 中医的十问歌和脉象分类
  • D1675/HBT191单通道高清视频放大电路解析
  • day45python打卡
  • DAY45 可视化
  • 现代Web安全实践:基于Token与Refresh Token的单点登录(SSO)实现
  • Dify工具插件开发和智能体开发全流程
  • ​​TPS3808​​低静态电流、可编程延迟电压监控电路,应用笔记
  • 深入理解数字音频:采样率、位深与量化
  • CSDN文章下载到本地的完整指南
  • [c#]判定当前软件是否用管理员权限打开
  • 数论——同余问题全家桶3 __int128和同余方程组
  • AI智能编码工具:阿里通义灵码使用个人版
  • 33 C 语言字符串转数值函数详解:atoi、atol、atoll、atof
  • 如何选择正确的团队交互模式:协作、服务还是促进?
  • 现实生活例子[特殊字符] 通俗易懂的解释[特殊字符] JS中的原型和原型链[特殊字符]