private void doRollback() {/* 从后往前回滚所有和当前事务T相关的日志记录,在磁盘中恢复原状旧值 * (setint、setstring),直到找到日志记录<START>为止 */ LogRecordIterator iter = new LogRecordIterator(); while (iter.MoveNext()) { LogRecord rec = iter.Current; if (rec.txNumber() == txnum) { if (rec.op() == LogRecord.START) { return; } rec.undo(txnum); } } }
private void doRecover() {/* 数据库的完全恢复操作:找到一个未完成事务的日志记录, * 就会撤销记录恢复旧值,一直到遇见检查点或者日志结束停止 */ List <int> finishedTxs = new List <int>(); LogRecordIterator iter = new LogRecordIterator(); while (iter.MoveNext()) { LogRecord rec = iter.Current; if (rec.op() == LogRecord.CHECKPOINT) { return;//检查点返回 } if (rec.op() == LogRecord.COMMIT || rec.op() == LogRecord.ROLLBACK) { finishedTxs.Add(rec.txNumber());//COMMIT、ROLLBACK表示此事务已提交,直接忽略 } else if (!finishedTxs.Contains(rec.txNumber())) { rec.undo(txnum);//若当前事务未完成则撤销 } } }