У меня есть подпрограмма, которая использует рекурсивный цикл для вставки элементов в базу данных SQL Server 2005. Первый вызов, который инициирует цикл, заключен в транзакцию с использованием TransactionScope. Когда я впервые вызываю ProcessItem, данные myItem вставляются в базу данных, как и ожидалось. Однако, когда ProcessItem вызывается из ProcessItemLinks или ProcessItemComments, я получаю следующую ошибку.
«Операция недействительна для состояния транзакции»
Я выполняю это в режиме отладки с VS 2008 на Windows 7, и у меня запущен 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()