为什么TransactionScope操作无效?

Cra*_*gly 13 c# asp.net transactionscope

我有一个例程,它使用递归循环将项插入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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪的顶部.不幸的是,我无法将这一点的构建显示为公司敏感信息,我无法透露.

   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()
Run Code Online (Sandbox Code Playgroud)

sha*_*ake 24

分布式交易使我的头发过早变灰了:)

普通嫌犯

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

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

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

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