Hi,大家好!我是白日梦!本文是MySQL专题的第 26 篇。

下文还是白日梦以自导自演的方式,围绕“组提交”展开本话题。看看你能抗到第几问吧

换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

公众号后台回复:数据库 可以参与抽奖活动,3本《MySQL技术内幕-InnoDB存储引擎》

欢迎关注白日梦,公众号首发!持续连载中




库尼奇瓦,同学,听说你上一面表现的还可以,这一面要不咱继续?



嗯,好啊!









好,你了解MySQL的两阶段提交不?说说看



嗯,了解。 简单来说两阶段提交就是将事务提交分成两部分,经过这两步处理后,我们称这个事务被提交了。









嗯,那两个阶段呢?你说说看!



可以看下面这张图:我们当执行commit命令时,会按照如下进行。

第一阶段:写redo log,并标识上prepare。

-- 中间穿插写binlog --

第二阶段:写redo log,完成事务的最终提交。










嗯,那你知不知道为什么事务的提交要分成两个阶段?



嗯,你看上图中的两阶段是redolog-prepare、redolog-commit这两个阶段,然后在这两个阶段中又写了binlog。

这个redolog主要提供的能力是对事务进行rollback、并且redolog是存储引擎层面记录的日志。

而binlog的作用是方面我们进行数据的备份以及MySQL集群主从之间的数据同步使用,并且binlog是MySQL上层,也就是Server层面记录的日志。

综上:MySQL的两阶段提交是为了保证redolog、binlog两者在逻辑上的一致性。才能进一步保证。事务的回滚、数据备份、已经MySQL集群之间的数据才是安全可靠的









嗯,那你能不能举个例子,更直观的告诉我,redolog、binlog两者在逻辑一致的必要性以及用途?



嗯,好啊!,比如这个例子:

在这个例子中,进行完第三步之后,没来得及写binlog,然后主库就挂了,事务也没来得及提交。

这时主库从新启动之后会选择将这个事务丢弃,因为如果它将事务提交了,从库们相对主库来说就少了这条数据,造成了主从数据不一致问题






嗯,在看这个例子

在这个例子中主库宕机前虽然也没有完成对事务对提交,但是它已经写了redolog-prepare、还写了binlog,binlog写完之后很可能从库已经收到这个最新的binlog,并且将这个binlog中的数据回放到自己身上了。

所以主库重新启动之后呢,会选择按照redolog将宕机前的事务状态从内存中恢复出来,也就是说把内存中的缓存页改成脏数据页,然后提交事务

这时主库如果不提交事务,那主库就比从库少了一条数据,同时会造成主从不一致的情况出现。






白日梦补充:
本小节我们重点看MySQL的组提交,而不是两阶段提交,想更多的两阶段提交的故事,可以点击查看白日梦写的:全网最牛X的两阶段提交笔记






嗯,你说的没错。我有个问题哈,你看你画的这张图,事务提交时写了好几次日志。

而且一般我们线上的数据库都有这两个配置

# 该参数控制binlog的落盘时机# 设置为1表示当事务被提交时将binlog落盘# 设置为0表示由文件系统自己控制binlog的落盘时机sync_binlog=1# 该参数控制redolog的落盘时机  # 设置为1表示当事务被提交时将redolog落盘innodb_flush_log_at_trx_commit=1

那你有没有想过:即使写日志是磁盘的顺序IO速度极快,即使固态硬盘的性能很

自导自演的面试现场之--你竟然不了解MySQL的组提交?的更多相关文章

  1. 自导自演的面试现场,趣学MySQL的10种文件

    导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"自导自演的数据库面试现场--谈谈MySQL的10种文件" 换一种写作风格 ...

  2. 大型面试现场:一条update sql执行都经历什么?

    导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"从一条update sql执行都经历什么开始,发散开一系列的问题,看看你能抗到第几 ...

  3. 面试现场:说说char 和 varchar的区别你了解多少?

    Hi,大家好!我是白日梦!本文是MySQL专题的第 26 篇. 下文还是白日梦以自导自演的方式,围绕"说说char 和 varchar的区别你了解多少?"展开本话题.看看你能抗到第 ...

  4. 【路由和交换之H3C自导自演】

    H3C配置自导自演 显示和维护及恢复 1:display display history-command    :查看历史命令记录 display diagnostic-information :查看 ...

  5. 天天坐在电脑面前,小心抑郁!来自一个人的旅行<自导自演>

    画图画累了?写代码写累了?何不放松一下呢. 一望无际.亲近自然.忘乎所以.放空自我! 一个人的旅行, GoPro拍摄,后期采用FCPX.记录梦想, 自导自演.一个人去了很多地方, 认识和很多当地人,交 ...

  6. 面试现场:裸面京东JavaT5第一轮电话面试

    人物简介 清辞女朋友,94年资深女程序员一枚,15年非本专业毕业,有过1年测试经验,3年Java开发经验,之前有个1年大公司的工作经历,2年的车联网公司经历,每天打卡式工作,朝九晚七.工作之余没看过一 ...

  7. 面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 AI 面试题库系列:https://www.showmeai.tech/ ...

  8. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  9. 【Java面试】请你简单说一下Mysql的事务隔离级别

    一个工作了6年的粉丝,去阿里面试,在第一面的时候被问到"Mysql的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...

随机推荐

  1. python了解未知函数的方法

    ?func 如图:

  2. springboot( 三)redis demo

    redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Red ...

  3. Big O Complexity Graph

    Big O Complexity Graph Big O === O() 算法复杂度速查表 数据结构 数组排序算法 Quicksort O(n log(n)) O(n log(n)) O(n^2) O ...

  4. robots.txt

    robots.txt A robots.txt file tells search engine crawlers which pages or files the crawler can or ca ...

  5. react slot component with args

    react slot component with args how to pass args to react props child component https://codesandbox.i ...

  6. Apache 低版本不支持 WebSocket

    Apache 低版本不支持 WebSocket Apache HTTP Server Version 2.4 Apache Module mod_proxy_wstunnel https://http ...

  7. css命名规范和书写规范

    1.位置属性(position, top, right, z-index, display, float等)2.大小(width, height, padding, margin)3.文字系列(fon ...

  8. ElasticSearch 搜索模板与建议

    公号:码农充电站pro 主页:https://codeshellme.github.io Search APIs 用于搜索和聚合存储在 ES 中的数据. 1,搜索模板 Template Search ...

  9. HarmonyOS三方件开发指南(13)-SwipeLayout侧滑删除

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. SwipeLayout组件功能介绍2. SwipeLayout使用方法3. SwipeLa ...

  10. Django Admin 后台Admin继承UserAdmin增加用户密码不显示明文和用户登录不了的解决方法

    Django后台Admin继承UserAdmin增加用户不显示明文方法 1.在 models.py 中用户表 # 导包规范-1.Python标准模块 from django.db import mod ...