开发者社区> jephon> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Undo日志文件的产生和使用

简介: 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 日志

比如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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
redo日志和undo日志区别是什么?
redo日志和undo日志区别是什么?
0 0
日志:Redo Log 和 Undo Log
本篇文章主要介绍 Redo Log 和 Undo Log: 1. 利用 Redo Log 和 Undo Log 实现本地事务的原子性、持久性 2. Redo Log 的写回策略 3. Redo Log Buffer 的刷盘时机
0 0
【REDO】删除REDO LOG重做日志组后需要手工删除对应的日志文件(转)
为保证重新创建的日志组成员可以成功创建,我们在删除日志组后需要手工删除对应的日志文件。1.查看数据库当前REDO LOG日志相关信息1)查看日志组信息sys@ora10g> select * from v$log;    GROUP#    THREAD#  SEQUENCE#      BYTES...
766 0
redo日志文件学习笔记(一)
关于redo日志文件,今天因为要做redo日志的在线迁移,所以特意做了个简单的总结。1. 如果要把redo的切换信息显示到alert日志中,需要设置个参数。 Oracle Database 11g Enterprise Edition Release 11.
639 0
redo 和 undo 之一
1、oracle 的日志分3类:  警告日志-=Alert log files ;  跟踪日志--Trace files用户和进程); 重做日志--redo log 录数据库的更改)。
1006 0
关于redo和undo的初识
oracle 的日志分3类:  警告日志-=Alert log files ;  跟踪日志--Trace files用户和进程);重做日志--redo log 录数据库的更改)。
659 0
C# Undo Redo
public void IWorkspaceEdit_Example(IWorkspace workspace, string nameOfFeatureClass)    {        IFeatureWorkspace featureWorkspace = (IFeatureWorkspa...
457 0
+关注
jephon
一直在路上..........
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载