我有一个例程,它使用递归循环将项插入到sql server 2005数据库中。第一个启动循环的调用使用transactionscope封装在事务中。当我第一次调用processitem时,myitem数据将按预期插入数据库。但是,当从processitemlinks或processitemcoments调用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()

最佳答案

分布式事务使我的头发过早变白:)
一般嫌疑犯
防火墙正在阻止msdtc
您的事务因某种原因超时(请尝试增加超时时间)
在处理当前事务的代码顶部有另一个事务作用域
使用dtcping等工具测试msdtc是否工作正常
也可以先插入少量元素进行测试。您的代码似乎在一个递归循环中,可以处理大量数据。可能您正在运行许多查询,而事务正在超时。
有时,system.transactions.transaction.current有一些关于发生了什么的线索。针对此全局变量添加监视

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

10-12 13:17