2009-03-23 12 views
36

私は、マルチスレッドを扱う際に、どのようにTransactionScopeクラスを正しい方法で使用するのかと思いましたか?TransactionScopeとマルチスレッド

メインスレッドで新しいスコープを作成し、次に2つのワーカースレッドを生成し、それらをメインスコープに参加させます。たとえば、スコープが決して1つでもない場合は各ワーカーでロールバックが呼び出されます。完了しました。

ThreadStaticAttributeを内部的に使用してTransactionScopeを読むと、上記の不可能/非常に困難なことが起こりました。同期化された方法でコードがなくなると、ロールバックが機能します。つまり、内部トランザクションはメイントランザクションに参加できますが、スレッド実行に切り替えることはできません。

おかげ

+1

いい質問です。これは単に私が "それをしない"と却下したシナリオですが、調査の結果、DependentTransactionを介したサポートがあります。私は何かを、おかげで学んだ。 –

答えて

28

MSDNを参照してください:

あなたはまた、複数の 関数呼び出しまたは複数のスレッド のコール間で 同じトランザクションを使用する必要が アプリケーションのためのTransactionScopeと DependentTransactionクラスを使用する必要があります。

DependentTransactionを見てください。特に、ワーカースレッドの例があります。hereです。

+0

私はこれらの2つのブログ記事が役に立つことも発見しました:http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspxおよびhttp://www.pluralsight.com/community/ブログ/ jimjohn/archive/2005/05/01/7923.aspx –

+2

これはあのブログは今見つかっていません – Kiquenet

+0

@Kiquenet [これらの]のような場合(http://web.archive.org/web/2/http ://pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspx)[two](http://web.archive.org/web/2/http://pluralsight.com /community/blogs/jimjohn/archive/2005/05/01/7923.aspx)、常に[ウェイバックマシン](https://en.wikipedia.org/wiki/Wikipedia:Using_the_Wayback_Machine#Latest_archive_copy) –

17

TransactionScopeクラスはTransaction.Currentプロパティを使用し、フィールドにその値を格納します。フィールドにはThreadStaticという属性が設定されています。

ThreadStatic属性は、フィールド値がスレッドアフィニティを取得することを保証します。つまり、スレッドごとに一意の値を持ちます。 のスレッド内で共有することをお勧めします。 Thread Local Storage(TLS)とも呼ばれます。

TransactionScopeクラスは、現在のスレッドでトランザクションコンテキストを定義するだけです。ただし、コードでは、そのスレッド内のすべてのジョブを実行する必要があるということではありません。私は、複数のスレッドを使用する複雑な計算アルゴリズムを想像することができます。

関連する問題