【SSIS Lightning】パッケージでトランザクションを構成する
シナリオと要件
SSIS では既定でタスクごとのトランザクションが実行されます。失敗したタスクの結果は自動的にロールバックされます。
一方,パッケージ全体をひとつのトランザクションとして取り扱いたい場合もあります。
ここでは,まず一番基本的なトランザクションの構成として,パッケージ全体を1つのトランザクションに参加させる構成を行います。
このトピックの関連ヘルプはこちらを参照してください。
http://msdn2.microsoft.com/ja-jp/library/ms137690.aspx
この記事は,
SQL Server 2005 Developer Edition Service Pack 1
Integration Services に基づいて記述しています。
トランザクションの実験ができる構成を準備する
パッケージ全体がトランザクションとして取り扱われているかを確認するために,2つの [データフロー タスク] を持つパッケージを準備します。
これらのパッケージはお互いに独立で動作可能な [データフロー タスク] として定義しておけば,
既定では片方のタスクがエラーで停止しても,もう一方のタスクはデータの操作をコミットすることになります。
1 [制御フロー] ペインで [データフロータスク] を2つ作成する。
2 [フラットファイル ソース] から [OLE DB 変換先] へデータをインポートするタスクを定義する。
1で作成した2つの [データフロー] に今回は同じ構成のフローを作成します。
2つのフラットファイルから,2つのテーブルに単純にデータを流し込むタスクです。
1つ目のフラットファイルは異常なデータを含むファイルで,このファイルの読み込みは失敗するようになっています。
※ 今回は SHIFT-JIS のファイルを読み込むために,[データ変換] タスクを組み込んでいますが,UNICODE データを読み込めばこれは必要ありません。
さて,最初の [データフロー] タスクに定義したフラットファイルからの読み取りは,エラーになるようなデータが含まれています。
このままパッケージのデバッグ実行を行うと,
- 最初のタスクは失敗して赤くなる
- 2番目のタスクは成功して青くなる
となります。
データを確認すれば,2番目のデータロードで定義したデータは挿入されていることが確認できるでしょう。
パッケージをトランザクション化する
個々の [データフロー タスク] を独立に動作させたい場合は上の方法で充分ですが,
やはり,パッケージ全体の処理を,全てコミットするか,全てロールバックするかの管理を行いたい場合は多いと思います。
そこで,パッケージ全体をトランザクション化します。
トランザクション化によって,全てのタスクが成功した場合のみコミットが走るようにします。
[ADO.NET 接続] を [ODBC] を用いて構成するというのが一番素直にできる構成のようです。
1 パッケージのプロパティ [TransactionOption] の値を確認します。[Supported] になっているはずです。
2 各タスクのプロパティ [TransactionOption] の値を確認します。こちらも[Supported] になっているはずです。
3 パッケージのプロパティ [TransactionOption] の値を [Required] に設定します。
実質的に,パッケージのトランザクション化に必要な作業は [TransactionOption] を [Required] に設定するだけです。
この設定によって,パッケージが明示的にトランザクションを開始して,パッケージ内に含まれる [Supported] ステータスのタスクをトランザクションに参加させます。
このパッケージを実行すると,「現在の分散トランザクションを中止しています。」のメッセージが表示され,パッケージの動作のロールバックが行われていることが確認できると思います。
ヒント
分散トランザクションサービスについて
パッケージトランザクションを実行させるためには,実行環境に「分散トランザクションサービス」(Distributed Transaction Coordinater)が必要です。
[MS DTC] が実行できないと,トランザクション自体の開始ができないため,パッケージがそもそも動作しなくなってしまいます。 [MS DTC] が動作していることを確認してください。
written by TimberLandChapel