3
因为如果先写数据库再写日志文件,发生故障后无法恢复这个修改。如果先写日志再写数据库,恢复时只需要多做一次undo
4
- 重做T1T3,回滚T2T4
- 重做T1,回滚T2T3
- 重做T1,回滚T2T3
- 重做T1,回滚T2
5
- A=8 B=7 C=11
- A=10 B=0 C=11
- A=10 B=0 C=11
- A=10 B=0 C=11
- A=10 B=0 C=11
- A=0 B=0 C=0
6
- 事务故障的恢复
- 对未提交事务进行强行回滚(ROLLBACK),清除该事务对数据库的所有修改,消除未提交事务的影响
- 保障事务原子性
- 系统故障的恢复
- 清除尚未完成的事务对数据库的所有修改
系统重新启动时,恢复程序要强行撤消(UNDO)所有未完成事务 - 将缓冲区中已完成事务提交的结果写入数据库
系统重新启动时,恢复程序需要重做(REDO)所有已提交的事务 - 实现上,需要日志文件的帮助
- 清除尚未完成的事务对数据库的所有修改
- 介质故障的恢复
- 装入数据库发生介质故障前某个时刻的数据副本
- 重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库
- 实现上,需要数据转储副本(即备份数据)和日志文件的帮助
7
- 检查点记录是一类新的日志记录
- 检查点记录的内容
- 建立检查点时刻所有正在执行的事务清单
- 这些事务最近一个日志记录的地址
8
恢复的时候不需要搜索整个日志,只需从上个检查点开始,效率更高
如下面图中从Tc开始处理就可,无需遍历前面的事务
9
- 检查点之前提交的事务不需要恢复
- 对于检查点之后才提交的事务,其恢复过程
- 从重新开始文件中找到最后一个检查点记录在日志文件中的地址
- 由该地址在日志文件中找到最后一个检查点记录
- 由该检查点记录得到检查点建立时刻所有正在执行的事务
- 从检查点开始正向扫描日志文件,直到日志文件结束,对读到的事务建立已提交和未提交队列
- 对已提交事务进行Redo操作,对未提交事务进Undo操作
