MySQL的两阶段提交

  • 两阶段提交过程
  • 为什么要写redo log,不写redo log的话,根本就不会出现“两阶段提交”的麻烦事啊?
  • 为什么要写两次redo log,写一次不行吗?
  • 在两阶段提交的情况下,是怎么实现崩溃恢复的呢?

在讲解两阶段提交之前,需要对MySQL中的binlog、redo log和undo log有一定的了解。两者的适用场景不同,binlog适用于维护集群内数据的一致性,redo log用于崩溃恢复,undo log相对于前面两种日志更好理解些,就是为了回滚事务用的。

两阶段提交过程

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与binlog都写一次的话,也就是存在以下两种情况:

  1. 先写binlog,再写redo log:当前事务提交后,写入binlog成功,之后主节点崩溃。在主节点重启后,由于没有写入redo log,因此不会恢复该条数据。而从节点依据binlog在本地回放后,会相对于主节点多出来一条数据,从而产生主从不一致。
  2. 先写redo log,再写binlog:当前事务提交后,写入redo log成功,之后主节点崩溃。在主节点重启后,主节点利用redo log进行恢复,就会相对于从节点多出来一条数据,造成主从数据不一致。

因此,只写一次redo log与binlog,无法保证主节点崩溃恢复与从节点本地回放数据的一致性

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

首先比较重要的一点是,在写入redo log时,会顺便记录XID,即当前事务id。在写入binlog时,也会写入XID。因此存在以下三种情况:

  1. 如果在写入redo log之前崩溃,那么此时redo log与binlog中都没有,是一致的情况,崩溃也无所谓。
  2. 如果在写入redo log prepare阶段后立马崩溃,之后会在崩恢复时,由于redo log没有被标记为commit。于是拿着redo log中的XID去bin log中查找,此时肯定是找不到的,那么执行回滚操作。
  3. 如果在写入bin log后立马崩溃,在恢复时,由redo log中的XID可以找到对应的bin log,这个时候直接提交即可。

总的来说,在崩溃恢复后,只要redo log不是处于commit阶段,那么就拿着redo log中的XID去binlog中寻找,找得到就提交,否则就回滚。在这样的机制下,两阶段提交能在崩溃恢复时,能够对提交中断的事务进行补偿,来确保redo log与binlog的数据一致性。

MySQL的两阶段提交(数据一致性)相关推荐

  1. mysql之两阶段提交

    什么是两阶段提交 当有数据修改时,会先将修改redo log cache和binlog cache然后在刷入到磁盘形成redo log file,当redo log file全都刷入到磁盘时(prep ...

  2. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)

    引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...

  3. mongodb mysql 事务_MongoDB数据库两阶段提交实现事务的方法详解 _ 蚂蚁视界

    本文实例讲述了MongoDB数据库两阶段提交实现事务的办法.分享给年夜家供年夜家参考,详细如下: MongoDB数据库中操作单个文档老是原子性的,然而,涉及多个文档的操作,通常被作为一个"事 ...

  4. 提交mysql代码_MySQL源码之两阶段提交

    在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version 配置: sync_binlog=1 innodb_flush_log_at_trx_com ...

  5. mysql commit阶段,MySQL 基本架构与日志两阶段提交

    MySQL大致可以分为Server层和存储引擎层 Server层包括连接器,查询缓存,解析器,预处理器,优化器,执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器和视图等 连接器 负责 ...

  6. MySQL 为什么需要两阶段提交?

    文章目录 1. 什么是两阶段提交 1.1 binlog 与 redolog binlog redo log 1.2 两阶段提交 2. 为什么需要两阶段提交 3. 小结 为什么要两阶段提交?一阶段提交不 ...

  7. 5.7之前的MySQL版本不完全支持两阶段提交

    在对最近发布的通用JCA适配器进行一些测试时,该适配器能够将对微服务(以及其他东西)的远程调用绑定到JTA事务中,我发现Mysql 5.6中的一个错误已经存在了将近十年. 在XA事务的"准备 ...

  8. flink的mysql两阶段提交_flink 两阶段提交

    flink exactly-once系列目录: 一.两阶段提交概述 二.TwoPhaseCommitSinkFunction与FlinkKafkaProducer源码分析 三.StreamingFil ...

  9. MySQL调优(七):滴滴一面二面题,服务器参数设置,redolog两阶段提交

    某同学的滴滴一面二面 1.自我介绍不要念稿 2.对项目描述要准确,不要看起来不懂装懂:态度问题.一些问题没接触过很正常.不要所有问题都抢着说,要展示态度. 服务器参数设置 thread_cache_s ...

  10. 分布式事务Seata的AT模式下两阶段提交原理

    文章目录 第一阶段 1. 扫描@GlobalTransactional注解,获取全局事务XID 2. TC生成全局事务XID,记录入库 3. 执行业务逻辑,提交本地事务,记录branch_table. ...

最新文章

  1. android开发岗_android应用开发
  2. 如何转载别人的CSDN文章
  3. 【渝粤教育】电大中专会计电算化作业 题库
  4. 定时器和promise_手写Promise核心原理,再也不怕面试官问我Promise原理
  5. mysql 字段等于select_mysql_select_计算字段_数据处理函数_5
  6. 最暖数据: 除夕有6.88亿人用微信红包传递狗年祝福
  7. 浪潮服务器系统套件,浪潮服务器随机套件版本列表
  8. label包裹input,点击label响应两次解决方法
  9. 按键编码ASCII对照表
  10. java 生成 顺序 uuid_Java 生成有序 UUID
  11. linux cuda 编程指南,CUDA编程指南阅读笔记
  12. 调试一个开源的车牌识别算法遇到的总结
  13. 两个同级路由如何相互访问
  14. android8.0的电池图标,Android 8.0 电池图标 显示分析
  15. mediawiki java_MediaWiki
  16. 2018高中计算机会考时间,2018高中会考时间安排_2018年高中会考什么时候考哪些科目...
  17. Privoxy + tor = ?
  18. 2021-2027全球与中国物联网基础设施市场现状及未来发展趋势
  19. 数字与字符串,,,字符串与字符串之间比较大小
  20. win10声音设置没有麦克风降噪的解决办法

热门文章

  1. 当我跑步时我在想什么读后感
  2. 概率论笔记4.1.4数学期望的性质/条件期望
  3. Dominant Indices
  4. yyds,Python爬虫从小白到Bigboss全套学习路线+视频+资料
  5. 固定效应模型VS随机效应模型
  6. 自然辩证法小论文选题_新颖的自然辩证法论文题目 自然辩证法论文题目哪个好...
  7. BCH闹剧,又一场带血的分叉
  8. 个股分析|巴菲特炒银行股的5个原因
  9. discuz 模板标签
  10. 饼图制作软件,饼图的制作方法