次の方法で共有


TransactionScope の入れ子

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

このサンプルは、TransactionScope インスタンスを入れ子にする方法を示す 4 つのシナリオで構成されています。1 つ目のシナリオは、作成者には構造がわからないサードパーティのアクティビティを入れ子にする方法を示しています。2 つ目と 3 つ目のシナリオは、タイムアウトがどのように機能するかを示しています。4 つ目のシナリオは、AbortInstanceOnTransactionFailure の設定を示しています。

TransactionScopeActivity の入れ子

1 つ目のシナリオのワークフローは、2 つの WriteLine アクティビティと 1 つの TransactionScope のシーケンスで構成されています。TransactionScope の本体は、2 つの WriteLine アクティビティ、トランザクションのローカル識別子を出力するカスタム アクティビティ、およびサードパーティのアクティビティのシーケンスです。サードパーティのアクティビティである TransactionScopeTest には TransactionScope が含まれていますが、ワークフローの作成者にはわかりません。このシナリオは、TransactionScope アクティビティを入れ子にできることを示しています。

タイムアウト

2 つ目のシナリオのワークフローは 1 つ目のシナリオとほとんど同じですが、TransactionScopeTestTransactionScope に置き換えられています。この TransactionScope の本体は 5 秒の遅延で、トランザクションのタイムアウトは 2 秒に設定されています。外側の TransactionScope のタイムアウトは 10 秒に設定されています。スコープで最も小さいタイムアウト値が適用されるため、トランザクションがタイムアウトします。

3 つ目のシナリオのワークフローは 2 つ目のシナリオとほとんど同じですが、遅延アクティビティが内側の TransactionScope の本体からその直後 (外側の TransactionScope の本体) に移動されています。この場合もトランザクションがタイムアウトしますが、内側の TransactionScope の 2 秒のタイムアウトはもう適用されないため、トランザクションは 10 秒後 (外側の TransactionScope のタイムアウト期間が経過したとき) にタイムアウトします。

トランザクション エラーによる中止

このワークフローは 3 つ目のシナリオに似ていますが、タイムアウトが AbortInstanceOnTransactionFailure プロパティに置き換えられています。内側にあるすべての子は、フラグが設定されている場合、フラグが外側の TransactionScope と一致している必要がありますが、このシナリオでは一致していないため、ワークフローを開くと例外がスローされます。

サンプルを実行するには

  1. Visual Studio 2010 で NestedTransactionScopeActivitySample.sln ソリューションを開きます。

  2. ソリューションをビルドするには、F6 キーを押すか、[ビルド] メニューの [ソリューションのビルド] をクリックします。

  3. ビルドが完了したら、F5 キーを押すか、[デバッグ] メニューの [デバッグ開始] をクリックします。または、Ctrl キーを押しながら F5 キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックして、デバッグ機能なしで実行します。

Dd807498.Important(ja-jp,VS.100).gif 注 :
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。

<InstallDrive>:\WF_WCF_Samples

このディレクトリが存在しない場合は、「.NET Framework 4 向けの Windows Communication Foundation (WCF) および Windows Workflow Foundation (WF) のサンプル」にアクセスして、Windows Communication Foundation (WCF) および WF のサンプルをすべてダウンロードしてください。このサンプルは、次のディレクトリに格納されます。

<InstallDrive>:\WF_WCF_Samples\WF\Basic\Transactions\NestedTransactionScope