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

Mysql的二阶段提交

先看执行器与InnoDB引擎是如何更新一条指定的数据的

 可以看到,InnoDB在写redo log时,并不是一次性写完的,而有两个阶段,Prepare与Commit阶段,这就是"两阶段提交"的含义。

为什么要写redo log,不写redo log的话,根本就不会出现“两阶段提交”的麻烦事啊?

先说结论:在于崩溃恢复。

MySQL为了提升性能,引入了BufferPool缓冲池。查询数据时,先从BufferPool中查询,查询不到则从磁盘加载在BufferPool。

每次对数据的更新,也不总是实时刷新到磁盘,而是先同步到BufferPool中,涉及到的数据页就会变成脏页。

同时会启动后台线程,异步地将脏页刷新到磁盘中,来完成BufferPool与磁盘的数据同步。

如果在某个时间,MySQL突然崩溃,则内存中的BufferPool就会丢失,剩余未同步的数据就会直接消失。

虽然在更新BufferPool后,也写入了binlog中,但binlog并不具备crash-safe的能力。

因为崩溃可能发生在写binlog后,刷脏前。在主从同步的情况下,从节点会拿到多出来的一条binlog。

所以server层的binlog是不支持崩溃恢复的,只是支持误删数据恢复。InnoDB考虑到这一点,自己实现了redo log。

为什么要写两次redo log,写一次不行吗?

先不谈到底写几次redo log合适,如果只写一次redo log会有什么样的问题呢?

redo log与binlog都写一次的话,也就是存在以下两种情况:

先写binlog,再写redo log

当前事务提交后,写入binlog成功,之后主节点崩溃。在主节点重启后,由于没有写入redo log,因此不会恢复该条数据。

而从节点依据binlog在本地回放后,会相对于主节点多出来一条数据,从而产生主从不一致。

先写redo log,再写binlog

当前事务提交后,写入redo log成功,之后主节点崩溃。在主节点重启后,主节点利用redo log进行恢复,就会相对于从节点多出来一条数据,造成主从数据不一致。

因此,只写一次redo log与binlog,无法保证这两种日志在事务提交后的一致性。

也就是无法保证主节点崩溃恢复与从节点本地回放数据的一致性。

在两阶段提交的情况下,是怎么实现崩溃恢复的呢?

首先比较重要的一点是,在写入redo log时,会顺便记录XID,即当前事务id。在写入binlog时,也会写入XID。

如果在写入redo log之前崩溃,那么此时redo log与binlog中都没有,是一致的情况,崩溃也无所谓。

如果在写入redo log prepare阶段后立马崩溃,之后会在崩恢复时,由于redo log没有被标记为commit。于是拿着redo log中的XID去binlog中查找,此时肯定是找不到的,那么执行回滚操作。

如果在写入binlog后立马崩溃,在恢复时,由redo log中的XID可以找到对应的binlog,这个时候直接提交即可。

总的来说,在崩溃恢复后,只要redo log不是处于commit阶段,那么就拿着redo log中的XID去binlog中寻找,找得到就提交,否则就回滚。

在这样的机制下,两阶段提交能在崩溃恢复时,能够对提交中断的事务进行补偿,来确保redo log与binlog的数据一致性。
 


http://www.kler.cn/news/148111.html

相关文章:

  • linux系统基线配置相关
  • C语言公交车之谜(ZZULIOJ1232:公交车之谜)
  • 青云科技容器平台与星辰天合存储产品完成兼容性互认证
  • hive总结
  • 深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统
  • 基于C#实现十字链表
  • ESP32-Web-Server编程-建立第一个网页
  • 从家暴谈中国女性在社会中的艰难处境
  • 【Rust】所有权的认识
  • 【VROC】看Intel VROC如何给NVMe SSD做RAID
  • Vue3-VueRouter4路由语法解析
  • 小程序如何禁止指定用户访问?如何设置指定用户才能访问?
  • FreeSQL 基本使用
  • C#,《小白学程序》第五课:队列(Queue)其一,排队的技术与算法
  • Docker Compose;docker-compose;docker compose
  • 深入Rust的模式匹配与枚举类型
  • C语言:编程实现1!+2!+3!+4!+……+n!
  • gitee代码路径大纲//test ok
  • Spring Security 6.x 系列(6)—— 显式设置和修改登录态信息
  • 湘潭大学 软件需求分析 填空题 期末考试复习
  • Postgresql源码(116)提升子查询案例分析
  • 中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞)
  • Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)
  • CSS新手入门笔记整理:CSS基本介绍
  • python中字符串操作函数split的用法
  • 【阿里云】图像识别 智能分类识别 项目开发(一)
  • 抖音小店怎么运营?新手应该如何做?一篇详解!
  • 【黑马程序员】——微服务全套——Nacos安装指南
  • netty学习
  • git commit message 书写规范