在ARIES算法中,为什么需要在重做过程中重复崩溃之前的所有历史?我可以在分析过程中获得提交的事务编号,然后重做提交的事务日志记录吗?这种方法将减少需要重做和撤消的记录数量。
简短回答:
我们需要在重做过程中重复崩溃前的所有历史,以确保在执行撤消过程之前数据库的一致性
长话短说:
恢复算法ARIES,为了确保DBMS的原子性和持久性,执行3个过程:
- 分析通过:查看需要做什么(向前播放日志)
- 重做过程:确保磁盘反映日志中但不在磁盘上的任何更新,包括属于最终将回滚的事务的更新。通过这种方式,它确保我们处于一致状态,这将允许逻辑撤消
- 撤消传递:删除任何丢失事务的操作
UNDO数据日志是逻辑的,而REDO数据日志则是物理的:
- 我们必须进行物理REDO,因为我们不能保证数据库处于一致状态(因此,例如,记录"INSERT VALUE X INTO TABLE Y"可能不是一个好主意,因为X可能反映在索引中,但不反映在表中,反之亦然,以防插入时发生崩溃)
- 我们可以做合乎逻辑的UNDO,因为在REDO之后,我们知道事情是一致的。事实上,我们必须执行逻辑UNDO,因为我们只执行某些操作,而对表单的UNDO进行物理日志记录,例如"索引y的拆分页x",在索引管理或不变维护方面可能不再是正确的做法。在重做过程中,我们不必担心这一点,因为我们会重复历史并回放所有内容,这意味着上次对数据库进行的任何物理修改都是正确的
源
原因是ARIES设计为使用无强制/窃取方法。"窃取"部分意味着来自未调试事务的更改可能会写入磁盘。因此,我们需要重做所有事务,包括已提交和未提交的事务,这样我们就可以撤消未提交的那些事务。