zoukankan      html  css  js  c++  java
  • 事务2

    redo日志位置:

      内存数据页变化日志

      iblogfile0, iblogfile1

    redo buffer:

      redo 缓冲区

      redo的buffer:数据页的变化信息+数据页当时的LSN号+TXID号

    redo的刷写策略:

      commit;

      刷新当前事务的redo buffer到磁盘

      还会顺便将一部分redo buffer 中没有提交的事务日志页刷新到磁盘

    MYSQL: 在启动时,必须保证redo日志文件和数据文件的LSN必须一致,如果不一致就会触发CSR,最终保证一致。

    CSR: 就是将redo log里记录了的数据变化,而磁盘里没有刷写进去的数据,提取到内存重做脏页然后刷写到磁盘,从而达到redo log和数据页的LSN号一致。

    情况一:

      

      我们做了一个事务,begin, update, commit;

      1、在begin后,会立即生成一个TXID,假设TXID=T01

      2、update时,会将需要修改的数据页(dp_01/ LSN=101),加载到data buffer中

      3、DBWR线程,会进行dp_01数据页修改更新,并更新dp_01/LSN=102

      4、LOGBWR日志写线程,会将dp_01数据页的变化+LSN+TXID 存储到redo buffer

      5、执行commit 时,LGWR日志写线程会将redo buffer 信息写入red log日志文件中,基于WAL原则(日志优先写)

      6、假设此时宕机,内存脏页没有来得及写入磁盘,内存数据全部丢失

      7、MYSQL再次启动时,必须要redo log 和磁盘数据页的LSN是一致的,

         但是此时dp_01, TXID的磁盘LSN=101,dp_01/TXID=T01。

         而redo log中的LSN=102

      8、MYSQL此时无法正常启动,mysql触发CSR,在内存追平LSN号,触发ckpt,

         将内存数据页更新到磁盘,从而保证磁盘数据页和redo log的LSN号是一致的,这时MYSQL才会正常启动

      以上的工作过程,我们把它称之为基于REDO的‘前滚过程’(重做日志)

    -----------------------------------------------------------------------------------------------------------------------------

    undo

    作用:

      在ACID特性中,主要保证A的特征,同时对CI也有一定功效

      (1) 记录了数据修改之前的状态

      (2) rollback 将内存的数据恢复到修改之前

      (3) 在CSR中实现未commit数据的归滚操作

      (4) 实现一致性快照,保证MVCC,读写操作不会互相阻塞

    情况一:

      

  • 相关阅读:
    一探前端开发中的JS调试技巧(转)
    JavaScript模板引擎实例应用(转)
    本周汇总
    完美解决IE8不支持margin auto问题
    移动端H5适配流程
    原型继承
    每周笔记
    一个页面多个bootstrip轮播以及一个页面多个swiper轮播 冲突问题
    如何让整个网页倾斜
    前端知识体系
  • 原文地址:https://www.cnblogs.com/ruan-ruan/p/13973492.html
Copyright © 2011-2022 走看看