コード例 #1
0
        Task IPageCache.CommitTransaction(ITransaction transaction)
        {
            using (var transactionHead = CleanupTransaction(transaction))
            {
                if (transactionHead == null || transactionHead.Updates == null || transactionHead.Updates.Count == 0)
                {
                    return(null);
                }

                var versionHead = _versions.Add(transaction.CommitVersionNumber);

                IPage newPage = null;
                foreach (var update in transactionHead.Updates.OrderBy(u => u.PageNumber).ThenBy(u => u.SequenceNumber))
                {
                    if (newPage == null || update.PageNumber != newPage.PageNumber)
                    {
                        var pageHead      = _pages.GetPageHead(update.PageNumber, CacheHints.ForUpdate);
                        var newestVersion = pageHead.GetVersion(null);

                        newPage = _pagePool.Get(update.PageNumber);
                        newestVersion.Data.CopyTo(newPage.Data, 0);

                        versionHead.AddPage(new PageVersion(versionHead.VersionNumber, newPage));
                    }

                    update.Data.CopyTo(newPage.Data, update.Offset);
                }

                versionHead.AddToPages(_pages);

                return(_fileSet.WriteAndCommit(transaction, transactionHead.Updates));
            }
        }