Undo 日志

比如A有200块钱, B有50 块钱,现在A要给B转100块” 。

(1)  开始事务 T1 (假设T1是个事务的内部编号)

(2)  A余额 = A余额 -100

(3)  B余额 = B余额 + 100

(4)  提交事务 T1

会对此事务记录Undo的日志文件,记录下事务开始之前的他俩账号余额:

[开始事务 T1]

[事务T1, A原有余额,200]

[事务T1, B原有余额,50]

如果事务执行到一半挂了,数据库重启以后我就根据undo的日志文件来恢复。

例子:如果第三步还没执行完就断电了, 数据库重启以后就需要根据undo日志复原,要是系统恢复的过程中又断电了,下次重启再次恢复,此操作拥有幂等性,重复多少次都没有问题。

如何判断哪些事务需要恢复

恢复之后需要在日志文件中加上一行 [回滚事务 T1] , 这样下一次恢复就不用再考虑T1这个事务了。

[开始事务 T1]

[事务T1, A原有余额,200]

[事务T1, B原有余额,50]

[提交事务 T1]

Undo日志文件中不仅仅只有余额, 事务的开始和结束也会记录,如果我在日志文件中看到了[提交事务 T1], 或者 [回滚事务 T1], 就表示此事务已经结束,不用再去理会它了, 更不用去恢复。 如果我只看到 [开始事务 T1], 而找不到提交或回滚,那就得恢复。

日志从缓冲区写入磁盘的时机

两条规则:

1.  在最新余额写入硬盘之前, 一定要先把相关的Undo日志记录写入硬盘。 例如[事务T1, A原有余额,200] 一定要在A的新余额=100写入硬盘之前写入。

2.  [提交事务 T1] 这样的Undo日志记录一定要在所有的新余额写入硬盘之后再写入。

  操作 数据缓冲区

Undo日志缓冲区

1

开始事务T1

 

开始事务T1

2  A余额 = A余额 -100 A新余额:100  事务T1,A原有余额,200
3  把undo日志缓冲区内容写入磁盘   ps:此步骤会清空undo日志缓冲区
4  把A新余额写入磁盘    
5 B余额 = B余额 + 100 B新余额:150  
6  把undo日志缓冲区内容写入磁盘    
7  把B新余额写入磁盘    
8  提交事务T1   提交事务T1
9  把undo日志缓冲区内容写入磁盘    

情况一:

如果系统在第4步和第5步之间崩溃,A的余额写入了硬盘,但是B的还没写入, Undo日志看起来是这样的:

[开始事务 T1]

[事务T1, A原有余额,200]

由于找不到事务结束的日志, 进行恢复操作, 把A的原有余额给恢复了。

情况二:

如果是在第7步和第8步之间系统崩溃,A和B的最新余额都写入了硬盘,但是没有提交事务, 那Undo日志看起来是这样的:

[开始事务 T1]

[事务T1, 旺财原有余额,200]

[事务T1, 小强原有余额,50]

由于没有事务结束的日志,也需要进行恢复,把A和B的原有余额恢复成200和50

情况三: 

如果是在第8步和第9步之间系统崩溃, A和B的最新余额都写入了硬盘也提交了事务, 但是提交事务的操作没有写入Undo 日志,Undo日志还是这样:

[开始事务 T1]

[事务T1, 旺财原有余额,200]

[事务T1, 小强原有余额,50]

由于没有事务结束的日志,需要进行恢复,把A和B原有余额恢复成200和50

Undo日志文件的产生和使用的更多相关文章

  1. MySQL数据库日志文件(redo与undo)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库日志文件时间:2019年2月25日内容:MySQL数据库日志文件(redo日志和undo日志 ...

  2. ORACLE 移动数据文件 控制文件 重做日志文件

    ORACLE数据库有时候需要对存储进行调整,增加分区.IO调优等等,此时需要移动数据文件.重做日志文件.控制文件等等,下文结合例子总结一下这方面的知识点. 进行数据文件.重做日志文件.控制文件的迁移前 ...

  3. 批量迁移Oracle数据文件,日志文件及控制文件

    有些时候需要将Oracle的多个数据文件以及日志文件重定位或者迁移到新的分区或新的位置,比如磁盘空间不足,或因为特殊需求.对于这种情形可以采取批量迁移的方式将多个数据文件或者日志文件实现一次性迁移.当 ...

  4. undo日志

    InnoDB’s Undo 前言 Undo log是InnoDB MVCC事务特性的重要组成部分.当我们对记录做了变更操作时就会产生undo记录,Undo记录默认被记录到系统表空间(ibdata)中, ...

  5. mysql 初识之日志文件篇

    日志文件 1. err日志     error log 记录mysql在运行的过程中所有较为严重的警告和错误信息,以及mysql server每次启动和关闭的详细信息.系统在默认情况下关闭error ...

  6. mysql基础---日志文件

    一 基本日志文件 MYSQL有不同类型的日志文件(各自存储了不同类型的日志),从它们当中可以查询到MYSQL里都做了些什么,对于MYSQL的管理工作,这些日志文件是不可缺少的. 1.错误日志(The ...

  7. MySQL 各类日志文件介绍

    日志文件 1.错误日志 ErrorLog 错误日志记录了MyQLServer运行过程中所有较为严重的警告和错误信息,以及MySQLServer每次启动和关闭的详细信息. 在默认情况下,系统记录错误日志 ...

  8. 数据库中的undo日志、redo日志

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  9. Oracle备份恢复之断电导致控制文件和日志文件损坏修复

    Oracle数据库遭遇断电遭遇ora-00214.ora-00314.ora-00312错误恢复案例一枚 1.数据库在17日21:19启动开始报错ora-214错误: Tue Jan 17 21:19 ...

随机推荐

  1. 回文(palindrome)

    如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文).

  2. 20169207《Linux内核原理与分析》第五周作业

    这周的任务主要分为两个方面,第一方面,学习MOOC网上视频第三讲并完成配套的实验.第二方面,学习课本的第四章和第六章. 首先从实验开始讲起,前期我们对Linux内核的源码做了一个简单的了解.包括Mai ...

  3. (记忆化搜索)Jury Compromise (poj 1015)

    http://acm.fzu.edu.cn/problem.php?pid=1005 Description The fastfood chain McBurger owns several rest ...

  4. codeforces815A Karen and Game 2017-06-27 15:22 31人阅读 评论(0) 收藏

    C. Karen and Game time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...

  5. codeforces 925 c big secret

    题意: 给你n个数,b[1],b[2],b[3].......,让你重新排列,使a[i]的值递增 a[i]和b的关系: a[i] = b[1]^b[2]^b[3]^....^b[i]; 首先说异或   ...

  6. spring处理线程并发

    http://www.open-open.com/bbs/view/1320130410702

  7. CSS 基础 例子 display属性:block、inline和inline-block的区别

    HTML中块级元素(block)和行级元素(inline):比如div就是常见的块级元素,span就是常见的行级元素. 可以通过css的display属性来设置一个元素到底是块级,还是行级元素:dis ...

  8. 调用GOOGLE的TTS实现文字转语音(XE7+小米2)(XE10.1+小米5)

    相关资料: 注意:在手机上必须选安装文字转语音引擎“google Text To Speech”地址:http://www.shouji56.com/soft/GoogleWenZiZhuanYuYi ...

  9. spring mvc请求过程

    spring mvc处理请求过程 1.    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...

  10. Alwasyon环境下增加数据文件需要注意的几点

    半夜收到报警短信,服务器磁盘空间不足,爬起来检查一番,发现由于索引重建导致,而且该磁盘下仍有自动增长的数据文件,由于该服务器上其他盘符有剩余空间,于是打算将该磁盘下的数据文件限制增长,并新增几个数据文 ...