gpt4 book ai didi

c# - 使用 TransactionScope : System. Transactions.TransactionAbortedException:事务已中止

转载 作者:太空狗 更新时间:2023-10-29 19:44:27 24 4
gpt4 key购买 nike

我们正在尝试使用下面的代码、.NET 3.5 和 SQL Server 2005 进行间接嵌套事务。

MSDN 表示,在使用 TransactionScope 时,只要应用程序在事务中打开第二个连接(甚至是同一个数据库),事务就会升级。

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,我们得到以下作为内部堆栈跟踪,

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)

谁能帮我找出失败的原因?

最佳答案

如果您使用 TransactionScope 并且您:

  • 打开一个以上的数据库连接
  • 正在连接到 SQL Server 2005 服务器

事务将升级到 DTC。检查其他 SO 问题:TransactionScope automatically escalating to MSDTC on some machines?

解决方案是:

  • 使用 SQL Server 2008 或
  • 使用 SqlTransaction 而不是 TransactionScope,就像前面的答案所建议的那样:

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

关于c# - 使用 TransactionScope : System. Transactions.TransactionAbortedException:事务已中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com