[Mysql] 两段提交
事务提交
Mysql 默认开启自动提交事务
两段提交
把一个事务分成两个阶段来提交,就是把redolog拆分成了prepare和commit两段
MySQL想要准备事务的时候会先写redolog、binlog分成两个阶段。
- 两阶段提交的第一阶段 (prepare阶段):写rodo-log 并将其标记为prepare状态。
- 紧接着写binlog
- 两阶段提交的第二阶段(commit阶段):写bin-log 并将其标记为commit状态。
为了保证redolog和binlog数据的安全一致性。只有在这两个日志文件逻辑上高度一致了。你才能放心地使用redolog帮你将数据库中的状态恢复成crash之前的状态,使用binlog实现数据备份、恢复、以及主从复制。而两阶段提交的机制可以保证这两个日志文件的逻辑是高度一致的。
问题
如果在step1阶段执行完之后,宕机了,怎么恢复呢?
会根据redolog将修改后的recovery出来,然后提交。
如何判断binlog和redolog是否达成了一致?
当MySQL写完redolog并将它标记为prepare状态时,并且会在redolog中记录一个XID,它全局唯一的标识着这个事务。而当你设置`sync_binlog=1`时,做完了上面第一阶段写redolog后,mysql就会对应binlog并且会直接将其刷新到磁盘中。磁盘上的row格式的binlog记录。binlog结束的位置上也有一个XID。
只要这个XID和redolog中记录的XID是一致的,MySQL就会认为binlog和redolog逻辑上一致。就上面的场景来说就会commit,而如果仅仅是rodolog中记录了XID,binlog中没有,MySQL就会RollBack。
两份日志文件逻辑对齐的标记是有一份相同的XID。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析