Esempio n. 1
0
        public void Can_use_transactions_to_isolate_saves(string storage)
        {
            using (var documentStore = NewDocumentStore(requestedStorage: storage))
            {
                EnsureDtcIsSupported(documentStore);
                var company = new Company {
                    Name = "Company Name"
                };
                var session = documentStore.OpenSession();
                using (RavenTransactionAccessor.StartTransaction())
                {
                    session.Store(company);
                    session.SaveChanges();

                    using (RavenTransactionAccessor.StartTransaction())
                    {
                        using (var session2 = documentStore.OpenSession())
                            Assert.Null(session2.Load <Company>(company.Id));
                    }
                    Assert.NotNull(session.Load <Company>(company.Id));
                    documentStore.DatabaseCommands.PrepareTransaction(RavenTransactionAccessor.GetTransactionInformation().Id);
                    documentStore.DatabaseCommands.Commit(RavenTransactionAccessor.GetTransactionInformation().Id);
                }
                Assert.NotNull(session.Load <Company>(company.Id));
            }
        }
Esempio n. 2
0
 public void Will_process_all_different_documents_enlisted_in_a_transaction(string storage)
 {
     using (var documentStore = NewDocumentStore(requestedStorage: storage))
     {
         EnsureDtcIsSupported(documentStore);
         using (RavenTransactionAccessor.StartTransaction())
         {
             using (var session = documentStore.OpenSession())
             {
                 // Remark: Don't change the order of the stored classes!
                 // This test will only fail if the classes are not
                 // stored in their alphabetical order!
                 session.Store(new Contact {
                     FirstName = "Contact"
                 });
                 session.Store(new Company {
                     Name = "Company"
                 });
                 session.SaveChanges();
             }
             documentStore.DatabaseCommands.PrepareTransaction(RavenTransactionAccessor.GetTransactionInformation().Id);
             documentStore.DatabaseCommands.Commit(RavenTransactionAccessor.GetTransactionInformation().Id);
         }
         Thread.Sleep(100);
         using (var session = documentStore.OpenSession())
         {
             Assert.NotNull(session.Load <Contact>("contacts/1"));
             Assert.NotNull(session.Load <Company>("companies/1"));
             session.SaveChanges();
         }
     }
 }
Esempio n. 3
0
        /// <summary>
        /// Perform a set based deletes using the specified index.
        /// </summary>
        /// <param name="indexName">Name of the index.</param>
        /// <param name="queryToDelete">The query to delete.</param>
        /// <param name="allowStale">if set to <c>true</c> [allow stale].</param>
        public void DeleteByIndex(string indexName, IndexQuery queryToDelete, bool allowStale)
        {
            CurrentOperationContext.Headers.Value = OperationsHeaders;
            var databaseBulkOperations = new DatabaseBulkOperations(database, RavenTransactionAccessor.GetTransactionInformation());

            databaseBulkOperations.DeleteByIndex(indexName, queryToDelete, allowStale);
        }
Esempio n. 4
0
        /// <summary>
        /// Perform a set based update using the specified index
        /// </summary>
        /// <param name="indexName">Name of the index.</param>
        /// <param name="queryToUpdate">The query to update.</param>
        /// <param name="patch">The patch request to use (using JavaScript)</param>
        /// <param name="allowStale">if set to <c>true</c> [allow stale].</param>
        public void UpdateByIndex(string indexName, IndexQuery queryToUpdate, ScriptedPatchRequest patch, bool allowStale)
        {
            CurrentOperationContext.Headers.Value = OperationsHeaders;
            var databaseBulkOperations = new DatabaseBulkOperations(database, RavenTransactionAccessor.GetTransactionInformation());

            databaseBulkOperations.UpdateByIndex(indexName, queryToUpdate, patch, allowStale);
        }
Esempio n. 5
0
        /// <summary>
        /// Rollbacks the transaction.
        /// </summary>
        /// <param name="transaction">The transaction.</param>
        internal static void RollbackTransaction(Transaction transaction)
        {
            var stack = CurrentStack;

            stack.TransactionState = StackInfo.TransactionStateEnum.Rollback;
            stack.Session.Rollback(RavenTransactionAccessor.GetTransactionInformation().Id);
        }
Esempio n. 6
0
        /// <summary>
        /// Gets the document for the specified key.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <returns></returns>
        public JsonDocument Get(string key)
        {
            CurrentOperationContext.Headers.Value = OperationsHeaders;
            var jsonDocument = database.Get(key, RavenTransactionAccessor.GetTransactionInformation());

            return(EnsureLocalDate(jsonDocument));
        }
Esempio n. 7
0
 /// <summary>
 /// Executed the specified commands as a single batch
 /// </summary>
 /// <param name="commandDatas">The command data.</param>
 public BatchResult[] Batch(IEnumerable <ICommandData> commandDatas)
 {
     foreach (var commandData in commandDatas)
     {
         commandData.TransactionInformation = RavenTransactionAccessor.GetTransactionInformation();
     }
     CurrentOperationContext.Headers.Value = OperationsHeaders;
     return(database.Batch(commandDatas));
 }
Esempio n. 8
0
 /// <summary>
 /// Gets the results for the specified ids.
 /// </summary>
 /// <param name="ids">The ids.</param>
 /// <param name="includes">The includes.</param>
 /// <returns></returns>
 public MultiLoadResult Get(string[] ids, string[] includes)
 {
     CurrentOperationContext.Headers.Value = OperationsHeaders;
     return(new MultiLoadResult
     {
         Results = ids
                   .Select(id => database.Get(id, RavenTransactionAccessor.GetTransactionInformation()))
                   .Where(document => document != null)
                   .Select(x => EnsureLocalDate(x).ToJson())
                   .ToList()
     });
 }
Esempio n. 9
0
        /// <summary>
        /// Registers the transaction.
        /// </summary>
        /// <param name="transaction">The transaction.</param>
        internal static void RegisterTransaction(Transaction transaction)
        {
            var stack = CurrentStack;

            // if no session yet, start new
            if (stack.Session == null)
            {
                stack.Session = (DocumentSession)transaction.DocumentStoreInstance.OpenSession();
            }
            // and if no transaction yet, then start new one
            if (stack.TopTransaction == null)
            {
                stack.TopTransaction   = transaction;
                stack.Transaction      = RavenTransactionAccessor.StartTransaction();
                stack.TransactionState = StackInfo.TransactionStateEnum.Active;
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Commits the transaction.
        /// </summary>
        /// <param name="transaction">The transaction.</param>
        internal static void CommitTransaction(Transaction transaction)
        {
            var stack = CurrentStack;

            if (stack.TopTransaction == transaction)
            {
                if (stack.TransactionState == StackInfo.TransactionStateEnum.Rollback)
                {
                    throw new SessionException("Nested transaction called Rollback and thus we are not able to commit!");
                }
                stack.Session.SaveChanges();
                stack.TransactionState = StackInfo.TransactionStateEnum.Commit;
                stack.Session.Commit(RavenTransactionAccessor.GetTransactionInformation().Id);
            }
            else
            {
                stack.Session.SaveChanges();
            }
        }
Esempio n. 11
0
        public void Can_use_transactions_to_isolate_saves()
        {
            using (var documentStore = NewDocumentStore())
            {
                var company = new Company {
                    Name = "Company Name"
                };
                var session = documentStore.OpenSession();
                using (RavenTransactionAccessor.StartTransaction())
                {
                    session.Store(company);
                    session.SaveChanges();

                    using (RavenTransactionAccessor.StartTransaction())
                    {
                        using (var session2 = documentStore.OpenSession())
                            Assert.Null(session2.Load <Company>(company.Id));
                    }
                    Assert.NotNull(session.Load <Company>(company.Id));
                    documentStore.DatabaseCommands.Commit(RavenTransactionAccessor.GetTransactionInformation().Id);
                }
                Assert.NotNull(session.Load <Company>(company.Id));
            }
        }
Esempio n. 12
0
 /// <summary>
 /// Deletes the document with the specified key.
 /// </summary>
 /// <param name="key">The key.</param>
 /// <param name="etag">The etag.</param>
 public void Delete(string key, Guid?etag)
 {
     CurrentOperationContext.Headers.Value = OperationsHeaders;
     database.Delete(key, etag, RavenTransactionAccessor.GetTransactionInformation());
 }
Esempio n. 13
0
 /// <summary>
 /// Puts the document with the specified key in the database
 /// </summary>
 /// <param name="key">The key.</param>
 /// <param name="etag">The etag.</param>
 /// <param name="document">The document.</param>
 /// <param name="metadata">The metadata.</param>
 /// <returns></returns>
 public PutResult Put(string key, Guid?etag, RavenJObject document, RavenJObject metadata)
 {
     CurrentOperationContext.Headers.Value = OperationsHeaders;
     return(database.Put(key, etag, document, metadata, RavenTransactionAccessor.GetTransactionInformation()));
 }
Esempio n. 14
0
        private RangeValue GetNextRange(IDatabaseCommands databaseCommands)
        {
#if !NETFX_CORE
            using (new TransactionScope(TransactionScopeOption.Suppress))
                using (RavenTransactionAccessor.SupressExplicitRavenTransaction())
                    using (databaseCommands.ForceReadFromMaster())
                    {
#endif
            ModifyCapacityIfRequired();
            while (true)
            {
                try
                {
                    var          minNextMax = Range.Max;
                    JsonDocument document;

                    try
                    {
                        document = GetDocument(databaseCommands);
                    }
                    catch (ConflictException e)
                    {
                        // resolving the conflict by selecting the highest number
                        var highestMax = e.ConflictedVersionIds
                                         .Select(conflictedVersionId => GetMaxFromDocument(databaseCommands.Get(conflictedVersionId), minNextMax))
                                         .Max();

                        PutDocument(databaseCommands, new JsonDocument
                        {
                            Etag       = e.Etag,
                            Metadata   = new RavenJObject(),
                            DataAsJson = RavenJObject.FromObject(new { Max = highestMax }),
                            Key        = HiLoDocumentKey
                        });

                        continue;
                    }

                    long min, max;
                    if (document == null)
                    {
                        min      = minNextMax + 1;
                        max      = minNextMax + capacity;
                        document = new JsonDocument
                        {
                            Etag = Etag.Empty,
                            // sending empty etag means - ensure the that the document does NOT exists
                            Metadata   = new RavenJObject(),
                            DataAsJson = RavenJObject.FromObject(new { Max = max }),
                            Key        = HiLoDocumentKey
                        };
                    }
                    else
                    {
                        var oldMax = GetMaxFromDocument(document, minNextMax);
                        min = oldMax + 1;
                        max = oldMax + capacity;

                        document.DataAsJson["Max"] = max;
                    }
                    PutDocument(databaseCommands, document);

                    return(new RangeValue(min, max));
                }
                catch (ConcurrencyException)
                {
                    // expected, we need to retry
                }
            }
#if !NETFX_CORE
        }
#endif
        }
Esempio n. 15
0
 /// <summary>
 /// Gets the document for the specified key.
 /// </summary>
 /// <param name="key">The key.</param>
 /// <returns></returns>
 public JsonDocument Get(string key)
 {
     CurrentOperationContext.Headers.Value = OperationsHeaders;
     return(database.Get(key, RavenTransactionAccessor.GetTransactionInformation()));
 }