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


    问题:请讲下mysql中undo log的作用

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

    回答要点:

    主要从以下几点去考虑

    1、undo log产生的背景;

    2、undo log的作用;

    开发中经常使用到mysql数据库,用mysql数据库时在新建库或表的时候,最常使用的存储引擎是innodb,在innodb中经常提到事务,那么事务是怎么实现的,可参见:《java面试一日一题:mysql事务是如何实现的》,事务实现的基础是undo log,由于常用的引擎有innodb和myIsam,在这两种引擎中innodb支持事务,而myIsam不支持事务,所以undo log是innodb特有的(redo log也是innodb特有)。

    既然undo log和事务有关,那么undo log是什么那,顾名思义,undo是不做的意思,在mysql中叫做回滚日志,回滚的意思是撤销之前的操作,那么对应到mysql中就是一条insert语句对应到undo log就是一条delete语句,delete语句就是insert语句,update语句还是update只不过数据是之前的数据,这就是undo log中记录的日志内容。

    上面了解到undo log是回滚日志,和回滚相干,既然是回滚那么必然要回退到之前的版本,所以在undo log中记录的就是和要执行的操作相反的操作。undo中就是记录了如果事务需要回滚的情况下要执行的操作,这是undo log的第一个作用

    我们知道在innodb下会为每条记录生成三列,trasaction_id、roll_pointer、row_id(如果表中没有主键的情况下),其中roll_pointer会指向当前记录的下个版本的地址,这个版本的数据会存储在undo log中,如下图

    从上图可以看到当前数据记录的score值为90,在undo log中还有两个版本的数据分别是45和87,在mysql默认的隔离级别可重复读中,就可以利用undo log中保存的版本记录,做到读写并发,提高性能,这种技术叫做MVCC,在可重复读级别下,同一个事务中多次读取操作,都是使用的第一次select语句开始时的traction_id,做到可重复读。针对普通的查询操作,例,select c1 from t where c2='' 这种都是快照读,快照读就是读取某个数据版本;像select c1 from t where c2 for update 这种属于当前读,会读取当前最新的版本。

    综上,undo log有两个作用,事务回滚和MVCC。

    一个爱写文章的程序员,欢迎关注我的公众号“北漂程序员”。我有故事,你有酒吗
  • 相关阅读:
    【原】git常见用法
    【转】EDID的简介和解析
    rsa公钥和私钥的生成
    往redis中存储数据是利用pipeline方法
    对于接口文档个的说明内容包括哪些
    blueprint的使用
    flask中如何生成迁移文件
    flask中自定义过滤器
    jsonify
    flask自定义处理错误方法
  • 原文地址:https://www.cnblogs.com/teach/p/14728445.html
Copyright © 2020-2023  润新知