private void InternalRollbackTransaction() { if (transactionLevel > 0) { // Remove opened streams created during transaction lock (openedStreams) { foreach (Guid streamId in streamsCreatedDuringTransaction) { WeakReference <StorageStream> reference; if (openedStreams.TryGetValue(streamId, out reference)) { StorageStream tmpStream; if (reference.TryGetTarget(out tmpStream)) { if (tmpStream != null) { tmpStream.InternalClose(); } } openedStreams.Remove(streamId); } } streamsCreatedDuringTransaction.Clear(); // Rollback data transactionStream.RollbackTransaction(); MasterStream.RollbackTransaction(); streamsChangedDuringTransaction.Clear(); // Rollback changes in stream table streamTableStream.ReloadSegmentsOnRollback(streamTableStreamMetadata); streamTable.RollbackTransaction(); // Reload segments in system and opened streams because segments has changed foreach (var item in openedStreams.Values.ToList()) { StorageStream tmpStream; if (item.TryGetTarget(out tmpStream)) { if (streamTable.Contains(tmpStream.StreamId)) { StorageStreamMetadata tmpStreamMetadata = streamTable.Get(tmpStream.StreamId); tmpStream.ReloadSegmentsOnRollback(tmpStreamMetadata); } else { tmpStream.InternalClose(); } } } // Reload empty space segments var freeSpaceStreamMetadata = streamTable.Get(SystemStreamId.EmptySpace); FreeSpaceStream.ReloadSegmentsOnRollback(freeSpaceStreamMetadata); } } }