不同的交易关键字

时间:2019-06-26 10:00:16

标签: c# .net database transactions

TransactionScope,CommitableTransaction,DbContext.Database.BeginTransaction,SqlConnection.BeginTransaction 和使用诸如 context2.Database.UseTransaction(existingTransactionObj.GetDbTransaction())之类的共享事务有什么区别?

我知道使用 TransactionScope 提供了环境事务-我可以使用它来确保具有多个操作的代码块的事务。 我可以用DbContext.Database.BeginTransaction()或SqlConnection.BeginTransaction()替换我的 TransactionScope ,而没有任何副作用吗?或者在选择一种方法时我应该考虑什么-因为所有这些似乎都提供相同的输出在测试中。即

 using (var scope = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
            {
                using (var connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    // Do multiple operations on the DB using the connection
                try
                {
                    // Run raw ADO.NET command in the transaction
                    var command = connection.CreateCommand();
                    command.CommandText = "DELETE FROM dbo.Blogs";
                    command.ExecuteNonQuery();

                    // Run an EF Core command in the transaction
                    var options = new DbContextOptionsBuilder<BloggingContext>()
                        .UseSqlServer(connection)
                        .Options;

                    using (var context = new BloggingContext(options))
                    {
                        context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
                        context.SaveChanges();
                    }

                    // Commit transaction if all commands succeed, transaction will auto-rollback
                    // when disposed if either commands fails
                    scope.Complete();
                }
                catch (System.Exception)
                {
                    // TODO: Handle failure
                }
                }
                scope.Complete();
             }

使用以下内容代替上面的内容:

 using (var transaction = new CommittableTransaction(
            new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
        {
            var connection = new SqlConnection(connectionString);


var options = new DbContextOptionsBuilder<BloggingContext>()
                        .UseSqlServer(connection)
                        .Options;

                    using (var context = new BloggingContext(options))
                    {
                        context.Database.OpenConnection();
                        context.Database.EnlistTransaction(transaction);

                        // do multiple operations using the context and plain ADO.Net
                          try
            {
                var options = new DbContextOptionsBuilder<BloggingContext>()
                    .UseSqlServer(connection)
                    .Options;

                using (var context = new BloggingContext(options))
                {
                    context.Database.OpenConnection();
                    context.Database.EnlistTransaction(transaction);

                    // Run raw ADO.NET command in the transaction
                    var command = connection.CreateCommand();
                    command.CommandText = "DELETE FROM dbo.Blogs";
                    command.ExecuteNonQuery();

                    // Run an EF Core command in the transaction
                    context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
                    context.SaveChanges();
                    context.Database.CloseConnection();
                }

                // Commit transaction if all commands succeed, transaction will auto-rollback
                // when disposed if either commands fails
                transaction.Commit();
            }
            catch (System.Exception)
            {
                // TODO: Handle failure
            }


                    }
                    transaction.Commit();
         } 

或使用

using (var context = new BloggingContext())
        {
            using (var transaction = context.Database.BeginTransaction())
            {
                try
                {
                    context.Blogs.RemoveRange();
                    context.SaveChanges();

                    context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
                    context.SaveChanges();

                    var blogs = context.Blogs
                        .OrderBy(b => b.Url)
                        .ToList();

                    // Commit transaction if all commands succeed, transaction will auto-rollback
                    // when disposed if either commands fails
                    transaction.Commit();
                }
                catch (Exception)
                {
                    // TODO: Handle failure
                }
            }
        }

或使用

using (var transaction = connection.BeginTransaction())
                {
                    try
                    {
                        // Run raw ADO.NET command in the transaction
                        var command = connection.CreateCommand();
                        command.Transaction = transaction;
                        command.CommandText = "DELETE FROM dbo.Blogs";
                        command.ExecuteNonQuery();

                        // Run an EF Core command in the transaction
                        var options = new DbContextOptionsBuilder<BloggingContext>()
                            .UseSqlServer(connection)
                            .Options;

                        using (var context = new BloggingContext(options))
                        {
                            context.Database.UseTransaction(transaction);
                            context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
                            context.SaveChanges();
                        }

                        // Commit transaction if all commands succeed, transaction will auto-rollback
                        // when disposed if either commands fails
                        transaction.Commit();
                    }
                    catch (System.Exception)
                    {
                        // TODO: Handle failure
                    }
                }

0 个答案:

没有答案