我有一个例程,它使用递归循环将项插入到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/