/// <summary> /// Rollback transaction operation - ignore all modified pages and return new pages into disk /// After rollback, all snapshot are closed /// </summary> public void Rollback() { ENSURE(_state == TransactionState.Active, $"transaction must be active to rollback (current state: {_state})"); LOG($"rollback transaction ({_transPages.TransactionSize} pages with {_transPages.NewPages.Count} returns)", "TRANSACTION"); // if transaction contains new pages, must return to database in another transaction if (_transPages.NewPages.Count > 0) { this.ReturnNewPages(); } // dispose all snaphosts foreach (var snapshot in _snapshots.Values) { // but first, if writable, discard changes if (snapshot.Mode == LockMode.Write) { // discard all dirty pages _disk.DiscardDirtyPages(snapshot.GetWritablePages(true, true).Select(x => x.Buffer)); // discard all clean pages _disk.DiscardCleanPages(snapshot.GetWritablePages(false, true).Select(x => x.Buffer)); } // now, release pages snapshot.Dispose(); } _state = TransactionState.Aborted; }