MySQL (十四) 两阶段提交
一. 两阶段提交
1.1 利用 binlog 和redolog 做到两阶段提交
从上图中看出:最后提交事务的三个步骤:
- 写入redo log ,处于prepare状态
- 写binlog
- 修改redo log 状态变为commit
由于redo log 的提交分为prepare 和commit两个阶段,所以我们称之为两阶段提交。
1.2 为什么要两阶段提交
假设我们不适用两阶段提交,那么binlog和redolog的提交就两种形式:
- 先写binlog 再写redolog
- 先写redolog 再写binlog
当我们要向表中DDL,插入一条记录R的时候。
情况一:
如果我们先写binlog再写redolog
,那么假设binlog写完后崩溃了,此时redolog还没写。那么重启恢复的时候就会出现问题:
binlog中已经有R的记录了,当从主机同步数据的时候,或者我们使用binlog恢复数据的时候
,就会同步R这条记录。但是redolog中没有关于R的记录,所以恢复崩溃之后,插入R记录的这个事务是无效的
,即数据库中没有该行的记录,而这就造成了数据不一致的情况。
情况二:
如果我们是先写redolog再写 binlog
,那么假设redolog写完后崩溃了,此时binlog还没写。那么重启恢复的时候也会出现问题:
redolog中已经有R的记录了,所以崩溃恢复之后,插入R记录的这个事务是有效的,通过该记录可以将数据恢复到数据库中;但是binlog中还没有关于R的记录,所以当从机从主机同步数据的时候,或者我们使用binlog恢复数据的时候,就不会同步到R这条记录
,这就造成了数据不一致。
两阶段提交如何保证数据一致性:
情况一:一阶段提交之后崩溃了,即 写入 redo log,处于 prepare 状态 的时候崩溃了,此时:由于 binlog 还没写,redo log 处于 prepare 状态还没提交,所以崩溃恢复的时候,这个事务会回滚,此时 binlog 还没写,所以也不会传到备库。
情况二:假设写完 binlog 之后崩溃了,此时:
redolog 中的日志是不完整的,处于 prepare 状态,还没有提交,那么恢复的时候,首先检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交
事务,如果不存在或者不完整,则回滚事务。
情况三:假设 redolog 处于 commit 状态的时候崩溃了,那么重启后的处理方案同情况二。
由此可见,两阶段提交能够确保数据的一致性。
MySQL (十四) 两阶段提交相关推荐
- MySQL 为什么需要两阶段提交?
文章目录 1. 什么是两阶段提交 1.1 binlog 与 redolog binlog redo log 1.2 两阶段提交 2. 为什么需要两阶段提交 3. 小结 为什么要两阶段提交?一阶段提交不 ...
- mongodb mysql 事务_MongoDB数据库两阶段提交实现事务的方法详解 _ 蚂蚁视界
本文实例讲述了MongoDB数据库两阶段提交实现事务的办法.分享给年夜家供年夜家参考,详细如下: MongoDB数据库中操作单个文档老是原子性的,然而,涉及多个文档的操作,通常被作为一个"事 ...
- 5.7之前的MySQL版本不完全支持两阶段提交
在对最近发布的通用JCA适配器进行一些测试时,该适配器能够将对微服务(以及其他东西)的远程调用绑定到JTA事务中,我发现Mysql 5.6中的一个错误已经存在了将近十年. 在XA事务的"准备 ...
- 提交mysql代码_MySQL源码之两阶段提交
在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version 配置: sync_binlog=1 innodb_flush_log_at_trx_com ...
- mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...
- mysql commit阶段,MySQL 基本架构与日志两阶段提交
MySQL大致可以分为Server层和存储引擎层 Server层包括连接器,查询缓存,解析器,预处理器,优化器,执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器和视图等 连接器 负责 ...
- flink的mysql两阶段提交_flink 两阶段提交
flink exactly-once系列目录: 一.两阶段提交概述 二.TwoPhaseCommitSinkFunction与FlinkKafkaProducer源码分析 三.StreamingFil ...
- mysql之两阶段提交
什么是两阶段提交 当有数据修改时,会先将修改redo log cache和binlog cache然后在刷入到磁盘形成redo log file,当redo log file全都刷入到磁盘时(prep ...
- MySQL调优(七):滴滴一面二面题,服务器参数设置,redolog两阶段提交
某同学的滴滴一面二面 1.自我介绍不要念稿 2.对项目描述要准确,不要看起来不懂装懂:态度问题.一些问题没接触过很正常.不要所有问题都抢着说,要展示态度. 服务器参数设置 thread_cache_s ...
- 两阶段提交(Two-Phase Commit)
两阶段提交 两阶段提交是一种同步协议,是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中保持原子性和一致性而设计的一种算法. 两阶段提交的执行过程 在两阶段提交 ...
最新文章
- JAVA---DOS命令学习
- python快速接手别人的代码_十步教你如何接手别人的代码!
- 周子学辞任中芯国际董事长
- 【ASP.NET】ASP.NET如何发布Web项目
- 微软紧急修复两个 RCE,影响 Windows Codecs 库和 Visual Studio
- 服务不支持chkconfig
- 旁边一位员工天天跟别人聊天,主管都不敢管,那你当什么主管
- 第4节 常见软件安装-Mysql和SQLyog
- LOJ2330「清华集训 2017」榕树之心
- 银联的支付创新产业基地将落户安徽合肥 投资达80亿
- ORBSLAM3整体框架
- linux终端安装deb文件,如何通过命令行安装.deb文件?
- HDMI 收发器简化家庭影院系统设计
- VisionPro FixtureCoord工具解释
- Python 各种测试框架简介(三):nose
- Python数据分析笔记----第六章pandas文件操作
- jacob操作word和excel
- 消除5个绩效管理流程的误区
- 计算机安全技术 实验报告,网络安全技术实验报告(共10篇).doc
- 模拟实现strncpy函数