예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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);//若当前事务未完成则撤销
                }
            }
        }