あなたの質問に答えるために、私は自分の例を書き始めました。それから、ニューハンプシャーで開催された SQL Saturday で講演したときに、Matt Mason に会ったことを覚えています。彼は、SSIS のマイクロソフト プログラム マネージャーです。
私は 2009 年から 2011 年までの 3 年間、ETL コードしか書いていませんでしたが、Matt が記事を書いていることに気づきました。
http://www.mattmasson.com/2011/12/design-pattern-avoiding-transactions/
これは、アプローチと見つけたエラーの概要です。
[エラー]
あなたが見つけたエラーは、問題のある MSDTC に関連しています。これは、問題なく構成され、正しく機能する必要があります。一般的な問題はファイアウォールです。この投稿をチェックしてください。
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/3a5c847e-9c7e-4628-b857-4e6edaa7936c/sql-task-transaction-required?forum=sqlintegrationservices
[解決策 1] - パッケージ、タスク、またはコンテナー レベルでトランザクションを使用します。
一部のデータ プロバイダーは MSDTC をサポートしていません。一部のタスクはトランザクションをサポートしていません。2 フェーズ コミットをサポートするために新しいレイヤーを追加しているため、これはパフォーマンスが低下する可能性があります。
http://technet.microsoft.com/en-us/library/aa213066(v=sql.80).aspx
[解決策 2] - 次のタスクを使用します。
A - BEGIN TRAN (EXECUTE SQL)
B - データフロー
C - 戻りコードをテストする
1 - GOOD = コミット (EXECUTE SQL)
2 - 失敗 = ROLLBACK (EXECUTE SQL)
接続で RetainSameConnection プロパティを True に設定する必要があります。
これにより、1 つのセッションまたは SPID を介してすべての呼び出しが強制されます。現在、すべてのトランザクション管理はサーバー上にあります。
[解決策 3] - すべてのコードを再起動できるように記述します。これは、外出してチェックポイントを使用するという意味ではありません。
1 つの解決策は、常に UPSERTS を使用することです。新しいデータを挿入します。古いデータを更新します。削除はテーブル内の単なるフラグです。このパターンでは、失敗したジョブを何度も実行して、同じ最終状態を達成できます。
もう 1 つの解決策は、すべてのエラー行を病院のテーブルに配置して手動で検査、修正、および挿入することです。
データベース スナップショットを使用しないのはなぜですか (変更されたばかりのレコードを追跡します)。ETL ジョブの前にスナップショットを作成します。エラーが発生した場合は、スナップショットからデータベースを復元します。最後のステップは、システムからスナップショットを削除してハウスをクリーンアップすることです。
要するに、これがあなたを助けるのに十分なアイデアであることを願っています.
取引オプションは優れていますが、いくつかのダウンフォールがあります. 例が必要な場合は、私に ping してください。
心から
J