【发布时间】:2023-03-23 12:01:01
【问题描述】:
我有一个使用递归循环将项目插入 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()
【问题讨论】:
-
你能发布异常的堆栈跟踪吗?
-
我添加了尽可能多的跟踪。希望够了!
-
你能发布整个异常吗?发布 ex.ToString() 的输出,然后编辑任何敏感内容。我想知道是否有一两个 InnerException。
-
嗨,Cragly,你解决了这个问题吗?我们面临同样的问题,但找不到任何关于如何解决它的提示。
-
这是由于我的交易由于某种原因超时(建议摇晃)。我花了几天时间寻找这个问题,但无法深入了解它。最后,我 AddItemToDatabase(myItem) ,如果可行,则处理其余部分。如果没有,则将异常抛出堆栈。如果添加到数据库有效并且其他任何操作都失败了,我会尝试删除我添加到数据库中的项目。这不是一个理想的解决方案,但它是让它工作并让我登上头条的唯一方法:)。希望对您有所帮助。
标签: c# asp.net transactionscope