扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
  • 面试宝典系列

    • MySQL面试题汇总
  • 宝典内容

    • 1.主键 超键 候选键 外键是什么?
    • 2.数据库事务的四个特性及含义?
    • 3.视图的作用,视图可以更改么?
    • 4.drop,delete与truncate的区别?
    • 5.索引的工作原理及其种类?
    • 6.连接的种类?
    • 7.数据库范式?
    • 8.数据库优化的思路?
    • 9.存储过程与触发器的区别
    • 10.解释 SQL 的 left join 和 right join?
    • 11.Mysql索引用的是什么算法?
    • 12.Mysql的存储引擎?
    • 13.Mysql事务隔离级别
    • 14.Mysql高可用方案有哪些?
    • 15.Mysql中utf8和utf8mb4区别?
    • 16.Mysql中乐观锁和悲观锁区别?
    • 17.Mysql索引主要是哪些?
    • 18.Mysql联合索引最左匹配原则?
    • 19.聚簇索引和非聚簇索引区别?
    • 20.如何查询一个字段是否命中了索引?
    • 21.Mysql中查询数据什么情况下不会命中索引?
    • 22.Mysql中的MVCC是什么?
    • 23.Mvcc和Redolog和Undolog以及Binlog有什么不同?
    • 24.Mysql读写分离以及主从同步?
    • 25.InnoDB的关键特性?
    • 26.Mysql如何保证一致性和持久性?
    • 27.为什么选择B+树作为索引结构?
    • 28.InnoDB的行锁模式?
    • 29.哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?
    • 30.为什么索引的key长度不能太长?
    • 31.Mysql的数据如何恢复到任意时间点?
    • 32.Mysql为什么加了索引可以加快查询?
    • 33.Explain命令有什么用?

扫码订阅《 》或入驻星球,即可阅读文章!

23.Mvcc和Redolog和Undolog以及Binlog有什么不同?


GOLANG ROADMAP
Mvcc和Redolog和Undolog以及Binlog有什么不同?
  • Mvcc

MVCC多版本并发控制是MySQL中基于乐观锁理论实现隔离级别的方式,用于读已提交和可重复读取隔离级别的实现。 在MySQL中,会在表中每一条数据后面添加两个字段,最近修改该行数据的事务ID,指向该行(undolog表中)回滚段的指针。 Read View判断行的可见性,创建一个新事务时,copy一份当前系统中的活跃事务列表。意思是,当前不应该被本事务看到的其他事务id列表。

  • UndoLog

UndoLog也就是我们常说的回滚日志文件 主要用于事务中执行失败,进行回滚,以及MVCC中对于数据历史版本的查看。 由引擎层的InnoDB引擎实现,是逻辑日志,记录数据修改被修改前的值,比如"把id='B' 修改为id = 'B2' ,那么undo日志就会用来存放id ='B'的记录”。 当一条数据需要更新前,会先把修改前的记录存储在undolog中,如果这个修改出现异常,,则会使用undo日志来实现回滚操作,保证事务的一致性。 当事务提交之后,undo log并不能立马被删除,而是会被放到待清理链表中,待判断没有事物用到该版本的信息时才可以清理相应undolog。它保存了事务发生之前的数据的一个版本,用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。

  • Redolog

Redolog是重做日志文件是记录数据修改之后的值,用于持久化到磁盘中。

Redolog包括两部分:

一. 是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;

二. 是磁盘上的重做日志文件(redo log file),该部分日志是持久的。

由引擎层的InnoDB引擎实现,是物理日志,记录的是物理数据页修改的信息,比如“某个数据页上内容发生了哪些改动”。当一条数据需要更新时,InnoDB会先将数据更新,然后记录redoLog 在内存中,然后找个时间将redoLog的操作执行到磁盘上的文件上。 不管是否提交成功我都记录,你要是回滚了,那我连回滚的修改也记录。它确保了事务的持久性。

  • Binlog

Binlog由Mysql的Server层实现,是逻辑日志,记录的是sql语句的原始逻辑,比如"把id='B' 修改为id = ‘B2’。

Binlog会写入指定大小的物理文件中,是追加写入的,当前文件写满则会创建新的文件写入。

产生:事务提交的时候,一次性将事务中的sql语句,按照一定的格式记录到binlog中。

用于复制和恢复在主从复制中,从库利用主库上的binlog进行重播(执行日志中记录的修改逻辑),实现主从同步。业务数据不一致或者错了,用binlog恢复。