zoukankan      html  css  js  c++  java
  • undo清理 &redo 持久化

    为了进行mvcc(多版本并发控制)与回滚,innodb单独管理着undo空间(undo space、rollback segment)。

    1)当执行update语句后,即使不执行commit,数据列也会在innodb缓冲池修改。但是innodb存储引擎无法确定用户执行update语句后,执行rollback操作还是commit操作。

         因此为了应对用户可能rollback操作的情形,先要将修改之前的数据保存到undo日志。

    2)当用户进行commit,缓冲池中变更的内容就会持久化。

    3)当用户进行rollback,就会将保存在undo日志的旧数据还原。

    innodb不会将缓冲池中的内容立即刷到数据文件,而是按照一定周期写入。所以,执行完(1)时,数据文件列值可能为新值,也可能为旧值。(若innodb的后台线程已经将记录写入数据文件,那么原值就会被更新为新值)

    大量客户连接中的数据发生变化时,undo日志会积累许多变更前的信息,这些积累的信息必须在某时刻进行删除,留出足够空间来保存以后的变更内容,这个动作就是undo清理(undo purge)。mysql5.7的innodb,允许用户将innodb_purge_threads系统变量设置为大于1的值,这样就可以多个undo清理线程做清理工作。

    redo持久化:

    当执行DML语句时,变更的数据会先记录到重做(redo)日志,同时持久化到磁盘。

    innodb存储引擎只在内存(innodb缓冲池)中更改实际数据表的数据,innodb会在某个时刻将仅在内存(innodb缓冲池)中更改的数据持久化到磁盘。

  • 相关阅读:
    登录及注册页面
    多方式登录
    git笔记
    后台主页模块设计
    auth模块迁移后需新增字段
    使用idea构建SpringBoot源码
    Springboot相关面试问题
    Springboot自动加载工具-devtools的理解与使用
    SpringBoot项目的一些简单常用配置
    Java线程池及Executor框架的理解
  • 原文地址:https://www.cnblogs.com/xxmysql/p/5749749.html
Copyright © 2011-2022 走看看