Integration Services のトランザクション
適用対象: SQL Server Azure Data Factory の SSIS Integration Runtime
パッケージではトランザクションを使用して、タスクがアトミック単位で実行するデータベース処理をバインドし、この処理によってデータの整合性を保ちます。 すべての種類の Microsoft Integration Services コンテナー (パッケージ、For ループ コンテナー、Foreach ループ コンテナー、シーケンス コンテナー、タスクをカプセル化するタスク ホスト) でトランザクションを使用するように設定できます。 Integration Services には、トランザクションを設定するオプションとして、 NotSupported、 Supported、および Requiredの 3 つが用意されています。
Required は、親コンテナーで既に開始されているトランザクションがない限り、コンテナーでトランザクションを開始するように指定します。 開始されているトランザクションが存在する場合は、トランザクションが結合されます。 たとえば、トランザクションをサポートするように設定されていないパッケージに Required オプションが設定されたシーケンス コンテナーが含まれている場合、シーケンス コンテナーは固有のトランザクションを開始します。 パッケージが Required オプションを使用するように設定されている場合、シーケンス コンテナーはパッケージのトランザクションを結合します。
Supported は、コンテナーがトランザクションを開始せず、親コンテナーが開始したトランザクションを結合するように指定します。 たとえば、4 つの SQL 実行タスクがあるパッケージでトランザクションが開始され、4 つのタスクすべてに Supported オプションが設定されている場合、いずれかのタスクが失敗すると、SQL 実行タスクで実行されたデータベース更新すべてがロールバックされます。 パッケージでトランザクションが開始されない場合、4 つの SQL 実行タスクはトランザクションによってバインドされないため、失敗したタスクで実行されたデータベース更新以外はロールバックされません。
NotSupported は、コンテナーがトランザクションを開始せず、既存のトランザクションも結合しないように指定します。 親コンテナーで開始されたトランザクションは、トランザクションをサポートしないように設定された子コンテナーに影響を与えません。 たとえば、トランザクションを開始するように設定されたパッケージに NotSupported オプションが設定された For ループ コンテナーが含まれていた場合、For ループのタスクが失敗してもロールバックは行われません。
トランザクションの設定は、コンテナーの TransactionOption プロパティで設定します。 このプロパティは、 の [ プロパティ SQL Server Data Tools (SSDT)] ウィンドウを使用して、またはプログラムによって設定できます。
注意
TransactionOption プロパティは、コンテナーによって要求された IsolationLevel プロパティの値が適用されるかどうかに影響します。 詳細については、 「パッケージのプロパティの設定」 の IsolationLevelプロパティの説明を参照してください。
トランザクションを使用するようにパッケージを構成する
トランザクションを使用するようにパッケージを構成する場合、次の 2 つのオプションがあります。
パッケージで 1 つのトランザクションを使用する。 この場合、このトランザクションを 開始 するのはパッケージ自体で、パッケージ内の個々のタスクやコンテナーはこの 1 つのトランザクションに参加します。
パッケージで複数のトランザクションを使用する。 この場合、パッケージでトランザクションがサポートされますが、トランザクションを実際に開始するのはパッケージ内のタスクやコンテナーになります。
次の手順では、これらの 2 つのオプションを構成する方法について説明します。
1 つのトランザクションを使用するようにパッケージを構成する
このオプションでは、パッケージ自体が 1 つのトランザクションを開始します。 このトランザクションを開始するようにパッケージを構成するには、パッケージの TransactionOption プロパティを [必須]に設定します。
次に、この 1 つのトランザクションに特定のタスクやコンテナーを参加させます。 トランザクションにタスクまたはコンテナーを参加させるには、該当するタスクまたはコンテナーの TransactionOption プロパティを [Supported (サポートあり)]に設定します。
SQL Server Data Tools (SSDT)で、トランザクションを使用するように構成するパッケージが含まれている Integration Services プロジェクトを開きます。
ソリューション エクスプローラーで、パッケージをダブルクリックして開きます。
[制御フロー] タブをクリックします。
制御フローのデザイン画面の背景で任意の場所を右クリックし、 [プロパティ] をクリックします。
[プロパティ] ウィンドウで、TransactionOption プロパティを [必須]に設定します。
[制御フロー] タブのデザイン画面で、トランザクションに登録するタスクまたはコンテナーを右クリックし、 [プロパティ]をクリックします。
[プロパティ] ウィンドウで、TransactionOption プロパティを [Supported (サポートあり)]に設定します。
Note
トランザクションに接続を登録するには、トランザクションで接続を使用するタスクを登録します。 詳細については、「Integration Services (SSIS) の接続」を参照してください。
トランザクションに登録する各タスクおよびコンテナーに対して、手順 6. と 7. を繰り返します。
複数のトランザクションを使用するようにパッケージを構成する
このオプションでは、パッケージでトランザクションがサポートされますが、パッケージ自体はトランザクションを開始しません。 トランザクションをサポートするようにパッケージを構成するには、パッケージの TransactionOption プロパティを [Supported (サポートあり)]に設定します。
次に、トランザクションを開始するかトランザクションに参加するように、パッケージ内の目的のタスクおよびコンテナーを構成します。 トランザクションを開始するようにタスクまたはコンテナーを構成するには、該当するタスクまたはコンテナーの TransactionOption プロパティを [必須]に設定します。
SQL Server Data Tools (SSDT)で、複数のトランザクションを使用するように構成するパッケージが含まれている Integration Services プロジェクトを開きます。
ソリューション エクスプローラーで、パッケージをダブルクリックして開きます。
[制御フロー] タブをクリックします。
制御フローのデザイン画面の背景で任意の場所を右クリックし、 [プロパティ] をクリックします。
[プロパティ] ウィンドウで、TransactionOption プロパティを [Supported (サポートあり)]に設定します。
Note
パッケージでトランザクションがサポートされますが、トランザクションは、パッケージ内のタスクまたはコンテナーによって開始されます。
[制御フロー] タブのデザイン画面で、トランザクションを開始するパッケージ内のタスクまたはコンテナーを右クリックし、 [プロパティ]をクリックします。
[プロパティ] ウィンドウで、TransactionOption プロパティを [必須]に設定します。
トランザクションがコンテナーによって開始される場合、トランザクションに登録するタスクまたはコンテナーを右クリックし、 [プロパティ]をクリックします。
[プロパティ] ウィンドウで、TransactionOption プロパティを [Supported (サポートあり)]に設定します。
Note
トランザクションに接続を登録するには、トランザクションで接続を使用するタスクを登録します。 詳細については、「Integration Services (SSIS) の接続」を参照してください。
トランザクションを開始する各タスクおよびコンテナーに対して、手順 6. ~ 9. を繰り返します。
パッケージ内の複数のトランザクション
Integration Services パッケージでは、関連しないトランザクションをパッケージに含めることができます。 入れ子になったコンテナー階層の中間にあるコンテナーでトランザクションがサポートされない場合、階層の上位または下位にあるコンテナーがトランザクションをサポートするように構成されている場合はそのコンテナーで別個のトランザクションが開始されます。 トランザクションは、入れ子になったコンテナー階層において最も内側のタスクから順にパッケージにコミットまたはロールバックされます。 ただし、内側のトランザクションがコミットされた後、その外側のトランザクションが中止された場合は、内側のトランザクションをロールバックできません。
パッケージ内の複数のトランザクションの例
たとえば、パッケージにシーケンス コンテナーが含まれていて、このコンテナーは、それぞれの 2 つの SQL 実行タスクを含む 2 つの Foreach ループ コンテナーを保持しているとします。 シーケンス コンテナーはトランザクションをサポートします。Foreach ループ コンテナーはトランザクションをサポートしませんが、SQL 実行タスクはサポートします。 この例では、各 SQL 実行タスクでそれぞれのトランザクションが開始され、シーケンス タスクのトランザクションが中止されてもロールバックされません。
この場合、シーケンス コンテナーの TransactionOption プロパティ、Foreach ループ コンテナー、および SQL 実行タスクを次のように設定します。
シーケンス コンテナーの TransactionOption プロパティを [Required]に設定します。
Foreach ループ コンテナーの TransactionOption プロパティを [NotSupported]に設定します。
SQL 実行タスクの TransactionOption プロパティを [Required]に設定します。
次の図は、パッケージ内の 5 つの関連しないトランザクションを示しています。 1 つのトランザクションはシーケンス コンテナーによって開始され、4 つのトランザクションは SQL 実行タスクによって開始されます。
トランザクションの継承
パッケージでパッケージ実行タスクを使用して、別のパッケージを実行できます。 パッケージ実行タスクで実行される子パッケージでは、独自のパッケージ トランザクションを作成する場合もあれば、親パッケージのトランザクションを継承する場合もあります。
次の 2 つの条件に該当する場合、パッケージは親パッケージのトランザクションを継承します。
パッケージがパッケージ実行タスクによって呼び出される。
パッケージを呼び出すパッケージ実行タスクも、親パッケージのトランザクションに参加している。
子パッケージ自身がトランザクションに参加していなければ、子パッケージのコンテナーやタスクは親パッケージのトランザクションに参加できません。
トランザクションの継承フローの例
次の図には、3 個のパッケージがあり、すべてトランザクションを使用します。 各パッケージには、複数のタスクが含まれています。 トランザクションの動作がわかりやすいように、パッケージ実行タスクは 1 つだけ示されています。 パッケージ A がパッケージ B および C を実行します。次に、パッケージ B がパッケージ D および E を実行し、パッケージ C がパッケージ F を実行します。
パッケージとタスクのトランザクション属性は次のとおりです。
パッケージ A および C のTransactionOption は Required に設定されています。
パッケージ B と D、およびパッケージ実行タスク B、パッケージ実行タスク D、パッケージ実行タスク F のTransactionOption は Supported に設定されています。
パッケージ E、およびパッケージ実行タスク C、パッケージ実行タスク E のTransactionOption は NotSupported に設定されています。
パッケージ B、D、および F のみが親パッケージのトランザクションを継承できます。
パッケージ B および D は、パッケージ A が開始したトランザクションを継承します。
パッケージ F はパッケージ C が開始したトランザクションを継承します。
パッケージ A および C は独自のトランザクションを制御します。
パッケージ E はトランザクションを使用しません。