2016-10-24 13 views
0

CMSTransactionScopeでラップされたデータのインポートを実行しています。データのKenticoトランザクションとロールバック

エラーが発生した場合、パラレルおよびロールバックでデータをインポートする最も効率的かつ実用的な方法は何でしょうか?私が見ている問題は、それが並行しているので、新しいスレッドが分かれば挿入されたオブジェクトをトランザクションの一部にすることができるかどうかわかりません。

これを実行する方法はありますか、それとも別の方法で処理する必要がありますか?

答えて

1

パフォーマンスを向上させるためにコードを並列で実行していて、基本的に行を1つずつ挿入すると、単一のスレッドで実行しているときよりも優れたパフォーマンスを発揮することはありません。 この場合はスレッドをCMSTransactionScopeと組み合わせて使用​​し、潜在的にはConnectionHelper.BulkInsertとすることをおすすめします。

とにかくクエリを並行して実行したい場合、コードがCMSTransactionScope.Commit()になる前にすべての文が実行されるようにするには、何らかの同期(ロックなど)を実装する必要があります(これは基本的にパフォーマンスの低下を意味します)。それ以外の場合、クエリは別々のトランザクションで実行されます。さらに、CMSTransactionScopeオブジェクトが常に同じIDataConnectionでインスタンス化されるようにする必要があります(コンストラクタへの接続を渡さない場合は、これがデフォルトで行われます)。

第二のアプローチは私になりやすいエラーようで、私はむしろ(など、非同期を使用して)、コードを最適化するさまざまな方法を見てみたい

+0

私は間違いなく理解し、のための最初のアプローチにあなたに同意することができますデータを挿入する。 データの更新はどうですか?たとえば、トランザクションスコープを持っていて、次に行を1つずつ並行して更新するループをしていますか?それが可能かどうか疑問に思っていますか?または、各スレッドに新しい接続スコープがあるため、kentico sqlの更新クエリでデッドロックが発生しますか?たぶん私はこれを考えすぎている.. – user1740075

+0

'CMSTransactionScope'内の' Parallel.ForEach() 'はデッドロックなしで動作するはずです。トランザクションスコープは独自の接続スコープを使用していますが、複数のスレッドを使用する場合でも再利用されることを期待しています。しかし、もしあれば、パフォーマンスの向上は最小限になると思います。見つけ出す最善の方法は試してみることです:) – rocky

関連する問題