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
分布式交易使我的头发过早变灰了:)
普通嫌犯
使用dtcping等工具测试MSDTC是否正常工作
也可以先插入少量元素进行测试.您的代码似乎处于递归循环中,可以处理大量数据.也许您正在运行许多查询,并且事务已超时.
有时System.Transactions.Transaction.Current对发生的事情有一些线索.针对此全局变量添加监视