コード例 #1
0
        /// <summary>
        /// Rolls back transaction by copying all backed up data bask to master stream and closes the transaction.
        /// </summary>
        public void RollbackTransaction()
        {
            if (logStreamHeader != null)
            {
                if (logStreamHeader.TransactionCompleted)
                {
                    throw new InvalidOperationException("Can't rollback completed transaction");
                }
                logStream.Position = TransactionLogStreamMetadata.StructureSize;

                // Copy segments from log stream back to stream
                for (int i = 0; i < logStreamHeader.SegmentCount; i++)
                {
                    SegmentMetadata sh = SegmentMetadata.Load(logStream);
                    if (!sh.TransactionId.Equals(logStreamHeader.TransactionId))
                    {
                        throw new InvalidOperationException("Wrong segment found in transaction log");
                    }
                    masterStream.Position = sh.Position;
                    CopyData(logStream, sh.Size, masterStream);
                }

                // Set back original stream length
                if (logStreamHeader.StreamLength < masterStream.Length)
                {
                    masterStream.SetLength(logStreamHeader.StreamLength);
                }

                masterStream.Flush();
                logStream.SetLength(0);
                logStream.Flush();
                logStreamHeader = null;
                rollbackNeeded  = false;
            }
        }