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)); } }