使用的TransactionScope:System.Transactions.TransactionAbortedException:该交易已中止 [英] using TransactionScope : System.Transactions.TransactionAbortedException: The transaction has aborted

查看:4492
本文介绍了使用的TransactionScope:System.Transactions.TransactionAbortedException:该交易已中止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试使用下面的code,.NET 3.5,和放大器做间接嵌套事务; SQL Server 2005的

We're trying to do indirect nesting transaction using the code below, .NET 3.5 ,& SQL Server 2005.

MSDN说,使用的TransactionScope时,一个事务,每当应用程序打开的事务中的第二个连接(甚至是同一个数据库)升级。

MSDN says that when using TransactionScope, a transaction is escalated whenever application opens a second connection (even to the same database) within the Transaction.

void RootMethod()
{
   using(TransactionScope scope = new TransactionScope())
   {
      /* Perform transactional work here */
      FirstMethod();
      SecondMethod();
      scope.Complete();
   }
 }

void FirstMethod()
{
    using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
   {
     using (SqlConnection conn1 = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI")) 
       {
     string insertString = @"
             insert into Categories
             (CategoryName, Description)
             values ('Laptop1', 'Model001')";
         conn1.Open();
         SqlCommand cmd = new SqlCommand(insertString, conn1);
         cmd.ExecuteNonQuery();
        }
      scope.Complete();
    }
 }

 void SecondMethod()
 {
    using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
   {
       using (SqlConnection conn2 = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI")) 
       {
     string insertString = @"
             insert into Categories
             (CategoryName, Description)
             values ('Laptop2', 'Model002')";

         conn2.Open();  //Looks like transactionabortedException is happening here
         SqlCommand cmd = new SqlCommand(insertString, conn2);
         cmd.ExecuteNonQuery();
        }
        scope.Complete();
    }
  }

有时候,交易失败了,不推广到DTC,我们得到以下的内堆栈跟踪,

Occasionally, the transaction fails that, is not promoting to DTC, and we are getting the following as the inner stack trace,

System.Transactions.TransactionAbortedException: The transaction has aborted. ---> 
System.Transactions.TransactionPromotionException: Failure while attempting to promote transaction. ---> 
System.InvalidOperationException: The requested operation cannot be completed because the connection has been broken.     
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)     
at System.Data.SqlClient.SqlDelegatedTransaction.Promote()     --- End of inner exception stack trace ---     
at System.Data.SqlClient.SqlDelegatedTransaction.Promote()     
at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)     
at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)     
--- End of inner exception stack trace ---     
at System.Transactions.TransactionStateAborted.CreateAbortingClone(InternalTransaction tx)     
at System.Transactions.DependentTransaction..ctor(IsolationLevel isoLevel, InternalTransaction internalTransaction, Boolean blocking)     
at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)     
at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)     
at System.Transactions.TransactionScope.PushScope()     
at System.Transactions.TransactionScope..ctor(TransactionScopeOption scopeOption)    

任何人都可以请帮我找出这个失败的原因?

Can anyone please help me figuring out the reason for this failure?

推荐答案

如果您使用的TransactionScope你:

If you use TransactionScope and you:

  • 开启多个连接到数据库和
  • 要连接到SQL Server 2005服务器

该交易将升级为DTC。检查此其他太问题:<一href="http://stackoverflow.com/questions/1690892/transactionscope-automatically-escalating-to-msdtc-on-some-machines">TransactionScope自动升级到MSDTC某些机器上?

the transaction will be escalated to DTC. Check this other SO question: TransactionScope automatically escalating to MSDTC on some machines?

的溶液可以是:

  • 使用SQL Server 2008或
  • 使用的SqlTransaction代替的TransactionScope就像前回答提示:

  • Use SQL Server 2008 or
  • Use SqlTransaction instead of TransactionScope just like the former answer suggests:

using (var conn = new SqlConnection(connectionString))
{  
    using (var tx = conn.BeginTransaction())
    {
        FirstMethod(conn);
        SecondMethod(conn);
        tx.Commit();
    }
}

这篇关于使用的TransactionScope:System.Transactions.TransactionAbortedException:该交易已中止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆