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

MySQL:两阶段提交

redo log(重做日志)让 InnoDB 存储引擎拥有了崩溃恢复能力。

binlog(归档日志)保证了 MySQL 集群架构的数据一致性。

虽然它们都属于持久化的保证,但是侧重点不同。

在执行更新语句过程,会记录 redo log 与 binlog 两块日志,以基本的事务为单位,redo log 在事务执行过程中可以不断写入,而 binlog 只有在提交事务时才写入,所以 redo log 与 binlog 的写入时机不一样。

回到正题,redo log 与 binlog 两份日志之间的逻辑不一致,会出现什么问题?

我们以update语句为例,假设id=2的记录,字段c值是0,把字段c值更新成1SQL语句为update T set c=1 where id=2

假设执行过程中写完 redo log 日志后,binlog 日志写期间发生了异常,会出现什么情况呢?

由于 binlog 没写完就异常,这时候 binlog 里面没有对应的修改记录。因此,之后用 binlog 日志恢复数据时,就会少这一次更新,恢复出来的这一行c值是0,而原库因为 redo log 日志恢复,这一行c值是1,最终数据不一致。

为了解决两份日志之间的逻辑一致问题,InnoDB 存储引擎使用两阶段提交方案。

原理很简单,将 redo log 的写入拆成了两个步骤preparecommit,这就是两阶段提交

使用两阶段提交后,写入 binlog 时发生异常也不会有影响,因为 MySQL 根据 redo log 日志恢复数据时,发现 redo log 还处于prepare阶段,并且没有对应 binlog 日志,就会回滚该事务。

 再看一个场景,redo log 设置commit阶段发生异常,那会不会回滚事务呢?

 并不会回滚事务,它会执行上图框住的逻辑,虽然 redo log 是处于prepare阶段,但是能通过事务id找到对应的 binlog 日志,所以 MySQL 认为是完整的,就会提交事务恢复数据。


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

相关文章:

  • 3D编辑器教程:如何实现3D模型多材质定制效果?
  • 【VIM】vim 常用命令
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • C++编程技巧与规范-类和对象
  • LeetCode【0035】搜索插入位置
  • uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用
  • [论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale
  • 27. 什么是MyBatis的动态代理机制?如何生成Mapper接口的实现类?
  • DoS、DDoS、DRDoS 攻击
  • CRACO 快速使用
  • 初始爬虫5
  • Linux 挂载磁盘与开机自动挂载操作指南
  • Vue 2 生命周期详解
  • 在Ubuntu 18.04上安装Nginx的方法
  • Probabilistic Embeddings for Cross-Modal Retrieval 论文阅读
  • C++string模拟实现
  • Llama Factory :百种以上语言模型的统一高效微调框架
  • UDP聊天室项目
  • 若依系统(Security)增加微信小程序登录(自定义登录)
  • nginx部署时的路径配置问题
  • 网络安全要点总结
  • 第四届长城杯-misc
  • 如何使用命令安装android的.aab包
  • Cesium 问题:视角漫游时添加的无人机模型飞行时有抖动
  • 隧道代理的原理及其挑选指南
  • 828华为云征文 | Flexus X实例在华为云EulerOS环境中部署堡垒机Jumpserver的详细指南