gpt4 book ai didi

c# - 为什么 TransactionScope 操作无效?

转载 作者:可可西里 更新时间:2023-11-01 08:04:17 29 4
gpt4 key购买 nike

我有一个使用递归循环将项目插入 SQL Server 2005 数据库的例程 启动循环的第一个调用包含在使用 TransactionScope 的事务中。当我第一次调用 ProcessItem 时,myItem 数据按预期插入到数据库中。但是,当从 ProcessItemLinks 或 ProcessItemComments 调用 ProcessItem 时,我收到以下错误。

“该操作对交易状态无效”

我在 Windows 7 上使用 VS 2008 调试运行它,并运行 MSDTC 以启用分布式事务。下面的代码不是我的生产代码,但设置完全相同。 AddItemToDatabase 是我无法修改的类上的一种方法,它使用标准的 ExecuteNonQuery() 创建连接,然后关闭并在完成后处理。

我已查看此处和互联网上的其他帖子,但仍无法解决此问题。任何帮助将不胜感激。

using (TransactionScope processItem = new TransactionScope())
{
foreach (Item myItem in itemsList)
{
ProcessItem(myItem);
}
processItem.Complete();
}
private void ProcessItem(Item myItem)
{
AddItemToDatabase(myItem);
ProcessItemLinks(myItem);
ProcessItemComments(myItem);
}
private void ProcessItemLinks(Item myItem)
{
foreach (Item link in myItem.Links)
{
ProcessItem(link);
}
}
private void ProcessItemComments(Item myItem)
{
foreach (Item comment in myItem.Comments)
{
ProcessItem(comment);
}
}

这是堆栈跟踪的顶部。不幸的是,我无法将到目前为止的构建显示为公司敏感信息,我不能透露。

   at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction)
at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()

最佳答案

分布式事务让我的头发过早变白:)

通常的嫌疑人

  1. 防火墙正在阻止 MSDTC
  2. 您的交易由于某种原因超时(尝试增加超时)
  3. 您在代码顶部的某处有另一个事务范围,它正在干扰当前事务

使用 dtcping 等工具测试 MSDTC 是否正常工作

同样先插入少量元素进行测试。您的代码似乎处于可以处理大量数据的递归循环中。也许您正在运行许多查询并且事务超时。

有时 System.Transactions.Transaction.Current 对发生的事情有一些线索。添加一个监视这个全局变量

关于c# - 为什么 TransactionScope 操作无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500967/

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