再帰ループを使用してSQLServer2005データベースにアイテムを挿入するルーチンがあります。ループを開始する最初の呼び出しは、TransactionScopeを使用するトランザクション内に含まれています。最初にProcessItemを呼び出すと、myItemデータが期待どおりにデータベースに挿入されます。ただし、ProcessItemがProcessItemLinksまたはProcessItemCommentsのいずれかから呼び出されると、次のエラーが発生します。
「操作はトランザクションの状態に対して無効です」</p>
これをWindows7上のVS2008でデバッグして実行しており、分散トランザクションを有効にするためにMSDTCを実行しています。以下のコードは私の本番コードではありませんが、まったく同じように設定されています。PASSWORDToDatabaseは、変更できないクラスのメソッドであり、接続を作成し、完了すると閉じて破棄する標準の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()