系统故障造成数据库不一致状态的原因有两个:
- 未完成事务对数据库的更新可能已写入数据库
- 已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库。
恢复操作就是要撤销故障发生时未完成的事务,重做已完成的事务。
为了节约资源,引入检查点记录,增加一个重新开始文件,并让恢复子系统在登录日志文件期间动态地维护日志。
例:
在检查点之后,系统故障之前,重做已完成的,撤销未完成的。
- T1在检查点之前已经提交,不必执行重做操作。
- T2在检查点之前开始执行,在检查点之后故障点之前提交。其对数据库所作的修改在故障发生时可能还在缓冲区中,尚未写入数据库,所以需要重做。
- T3在检查点之前开始执行,在故障点时还未完成。直接撤销。
- T4在检查点之后开始执行,在故障点之前提交。其对数据库所作的修改在故障发生时可能还在缓冲区中,尚未写入数据库,所以需要重做。
- T5在检查点之后开始执行,在故障点时还未完成。直接撤销。
故障之前提交的需要重做,故障之前开始的需要回滚,故障之后开始的什么也不用干。系统恢复后值只与已提交的事务有关。