2012-02-23 9 views
3

私は、特定の操作中に多くの更新と挿入を実行する必要があるWPFアプリケーションで作業しています。 Fluent Nhibernate 3.2を使用しています。 すべての更新と挿入を1つのトランザクションで実行して、エラーがあればすべてのステップをロールバックできるようにします。 各ステップのコマンドが定義されています。 問題は、insertコマンドの1つでは、スレッドごとに新しいステートレスセッションを作成するParallel.Foreachループを使用していることです。トランザクション内で複数のnhibernateセッションを実行する

ここで、これらのコマンドをすべてトランザクション内にラップしたい場合は、どうすればよいですか。

すでにUnitOfWorkが実装されていますが、一度に複数のセッションを許可していません。だから、私はUnitOfWorkから離れ、それぞれのコマンドにSessionfactoryを直接渡すことを考えました。すべてのコマンドは、独自のセッションを作成して実行します。 私たちは、すべてのコマンドを実行し、コマンドプロセッサがあります。

public class CommandProcessor : ICommandProcessor 
    { 
     public void ExecuteCommands (IEnumerable<ICommand> commands) 
     { 
      using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
      { 
       foreach (var command in commands) 
       { 
         command.Execute(UnitOfWork.UnitOfWorkFactory.SessionFactory); 
       } 

       scope.Complete(); 
      } 
     } 
    } 

トランザクションスコープは、私はエラー を得るように動作していないように「操作はトランザクションの状態には有効ではありません」。

これはトランザクションスコープの正しい使用法ですか? 私はどのように進歩することができますか?

ありがとうございました。

+0

すべてのコマンドで同じセッションを使用してみませんか? –

+0

私はParallel.Foreachをコマンドの1つで使用していないことができました。 – Sennin

+0

NHibernateが別のスレッドで各セッションを動かす必要があるという点で、これについて知ることができます。ここの例が助けてくれますか? http://stackoverflow.com/questions/1192111/how-do-i-do-nested-transactions-in-nhibernate –

答えて

0

しないでください。パフォーマンスの問題を考慮したい場合、NHibernateはMSSqlServer、Oracle、Postgresのバッチ処理戦略を提供します。これらの戦略は、適切なバッチ/ dbコール数の更新/挿入を処理します。複数のスレッドでセッションを共有しないでください(そうしないでください)、Parallel.ForEachを使用するためにのみDTSを使用しないことをお勧めします。

関連する問題