6.830 Lab 6: Rollback and Recovery
lab6要实现的是simpledb的日志系统,以支持回滚和崩溃恢复;
- steal/no-steal: 是否允许一个uncommitted的事务将修改更新到磁盘,如果是steal策略,那么此时磁盘上就可能包含uncommitted的数据,因此系统需要记录undo log,以防事务abort时进行回滚(roll-back)。如果是no steal策略,就表示磁盘上不会存在uncommitted数据,因此无需回滚操作,也就无需记录undo log。
- force/no-force:force策略表示事务在committed之后必须将所有更新立刻持久化到磁盘,这样会导致磁盘发生很多小的写操作(更可能是随机写)。no-force表示事务在committed之后可以不立即持久化到磁盘, 这样可以缓存很多的更新批量持久化到磁盘,这样可以降低磁盘操作次数(提升顺序写),但是如果committed之后发生crash,那么此时已经committed的事务数据将会丢失(因为还没有持久化到磁盘),因此系统需要记录redo log,在系统重启时候进行前滚(roll-forward)操作。
Exercise 1: Rollback
rollback是undo log做的事,即提供上一个版本的快照(相比MVCC真是微不足道),在回滚时将上一个版本的数据写回磁盘,思路比较简单:
1.根据tidToFirstLogRecord获取该事务第一条记录的位置;
2.移动到日志开始的地方;
3.根据日志格式进行读取日志记录,读到update格式的记录时根据事务id判断是否为要修改的日志,如果是,写before image
Exercise 2.Recovery
崩溃恢复是redo log要做的事,在因故障数据丢失时,有部分数据是还未写入数据库的,这个时候可以利用到undo log。从日志文件中,我们可以获取到checkpoint所在位置,然后对checkpoint后面的日志记录进行读取并进行恢复数据。
1.对于未提交的事务:使用before-image对其进行恢复;
2.对于已提交的事务:使用after-image对其进行恢复;
总结
本lab是实现回滚和恢复,实验没有太多可以注意的点,但相关知识还需要精进下。