コード例 #1
0
        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);
                }
            }
        }