关于课本关于事务的系统故障恢复

2021-02-08 22:01:37 +08:00
 zxCoder

系统故障的恢复 ( 1 ) 正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列( REDO-LIST )。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销队列。 ( 2 ) 对撤销对列中的各个事务进行撤销处理。进行撤销处理的方法是,反向扫描日志文件,对每个撤销事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库。 ( 3 ) 对重做队列中的各个事务进行重做处理。进行重做处理的方法是:正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作,即将日志记录中“更新后”的值写入数据库。

我的理解是,事务对数据库的写操作一开始都是操作在内存,还没刷回磁盘里,然后发生了系统故障

然后恢复的时候,已提交的事务,修改都只是在内存里,所以现在丢失了,需要重做,而未提交的事务,可能是做了一部分修改,也是在内存里,我的疑问是,这里为什么要撤销呢?意思是这一部分在内存的修改也有可能会刷到磁盘里吗?

546 次点击
所在节点    问与答
3 条回复
mahogany
2021-02-09 18:08:27 +08:00
内存的数据一定是最新的,但是内存刷盘操作随机发生,没有时序和逻辑的保证,磁盘中的数据页的同步状态完全不可知。突然故障,只能依赖 redolog 来恢复。
zxCoder
2021-02-11 11:57:05 +08:00
@mahogany 不太理解 undo 和 redo 的区别,既然发生故障了,那按理说不是所有事务都需要重做吗
mahogany
2021-02-19 09:42:34 +08:00
@zxCoder 不是的,都是增量部分。你可以看一下 redo log 和 undo log 的实现原理,然后就明白了。
比如说你会发现 redo log 和 undo log 其实不对称,undo log 记录在 redo log 里面;如果数据库不要求实现事务的话,那么 undo log 并不必要,redo log 才是必须的。
你看的这个概括的东西缺乏很多具体细节,当你更深入地了解一些的时候,才会有比较好的理解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX