数据库的UNDO和REDO

2020年的第一篇博客,哈哈哈

Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback(回滚);

Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。

通过Undo/Redo操作,可实现界面操作过程的撤销和恢复。

Undo是将用户上一步做的操作对程序造成的改动恢复到改动之前,而Redo操作是指重新实现这种改动。

Undo/Redo操作的实现方式分为两类:记录数据和记录操作。

记录数据是指将信息编辑窗口打开时,保存原始数据,然后记录用户每次操作后的结果数据,这里的数据是指信息编辑窗口中所有可能发生变动的数据。做undo操作时程序将用户上一步操作前的数据传给信息编辑窗口相应控件。这种做法是以空间来换时间,程序不必考虑用户到底改变了哪些数据,反正每次都是替换的所有可能改变的数据。当每次保存的数据量比较小时,这种做法比较方便快捷,但是如果数据量大,比如包括图形、视频信息等,这种方法就比较耗费内存了。

记录操作是指信息编辑窗口打开后,记录用户每次的操作,包括具体的操作动作以及操作改变的数据,这里的数据是指既能还原操作的数据又能重复操作的数据。做undo操作时程序根据记录的用户操作进行反向处理,对信息编辑窗口进行改动,而做redo操作的时候程序根据记录的用户操作来重复用户的操作。这种做法是以时间换来空间,程序记录的信息变少了,每次只需要记录用户的操作类型以及相关的操作数据(比如用户编辑的哪个控件,编辑前后的控件内容分别是什么),与操作无关的其他数据则不需要记录。这种做法比起记录数据的方式肯定要复杂,但是胜于节俭内存。

在系统故障的恢复策略中,如果存在数据的多个Undo操作,需要将数据恢复到第一个失败事务之前,如果正向扫描处理日志文件,无法实现这一目标,因此要反响扫描日志文件;对于同一个数据的多个Redo操作,需要将数据恢复到最后一个成功事务之后,因此应该正向扫描日志文件。Undo可以保证将未成功提交的事务所有操作都取消,而Redo可以保证将成功提交的事务所有操作都完成,所以两者结合可以保证事务的原子性(要么操作都做,要么都不做);Redo可以保证事务只要提交,改变一定被永久实现,故Redo可以保证事务的持续性(事务一旦提交,对数据库的改变将是永久性的)。

发布了143 篇原创文章 · 获赞 78 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/KK_2018/article/details/103793045