4

シーケンス コンテナーに追加された 3 つの並列データ フロー タスクを含むパッケージがあります。3 つのデータ フロー タスクがすべて正常に実行された場合にトランザクションが完了するように、トランザクションを実装する必要があります。いずれかのデータ フロー タスクが失敗した場合、トランザクションはロールバックする必要があります。

このパッケージをテストしていますが、機能していません。

  • 1 つをドラッグアンドsequence containerドロップし data flow task 1、3 つのデータ フロー タスクすべてを構成しました。data flow task 2data flow task 3

  • sequencee コンテナのプロパティで、次のプロパティを設定しました

    Transaction: supported

    Isolation: readcommited

  • 3 つのデータ フロー タスクのプロパティで、次のプロパティを設定しました。

    Transaction: supported

    Isolation: readuncommited

  • パッケージを実行すると、データ フロー タスク 1 は失敗しますが、データ フロー タスク 2 へのデータはまだ挿入およびコミットされています。

データ フロー タスクの 1 つが失敗した場合でも、データ フロー タスクがトランザクションをコミットしないようにするにはどうすればよいですか?

4

3 に答える 3

5

私は他の答えに同意します。あなたの問題では、囲んでいるコンテナのトランザクションスコープを に設定する必要がありますRequired。内部オブジェクトを変更していない限り、それらのデフォルトのトランザクション レベルはSupported、可能であればトランザクションに参加することを意味します。Required設定はトランザクションを開始し、完全をNotSupported期すために、設計によってはデッドロックが発生する可能性がある既存のトランザクションを Executable/Container が無視することを示します。

トランザクションが期待どおりに動作していることを確認するために、ターゲット テーブルを削除して再作成するサンプル パッケージを作成しました。パッケージには 3 つのデータ フローがあり、それぞれが一意の値 (1、2、4) をテーブルに追加するため、このようなクエリは値が宛先テーブルに到着したかどうかを示します。

SELECT count(1) AS rc, sum(T.col1) AS Total FROM dbo.TrxTest T

ご覧のとおり、7 つの変数があり、3 つがペアになっています。FailDataFlow という名前のものは、一意のデータ フローのいずれかが失敗/成功することを許可するブール値です。これは、対応するクエリの where 句で 0 による除算の例外を発生させることによって実現されます。

データフローの説明

シーケンス コンテナには の TransactionOption がありRequiredます。個々のデータ フローは、デフォルトの TransactionOption を保持します。Supported.

最初の実行では、分散トランザクション コーディネーターがこの VM で手動で起動するように設定されていたため、このコーディネーターと通信できませんでした。この問題を修正すると、「DFT 値 2」がゼロ除算の例外を生成したため、パッケージが正しく失敗しました。上記のクエリを実行すると、「DFT 値 1」に緑色のボックスが存在するにもかかわらず、テーブルに何も表示されませんでした。

ここに画像の説明を入力

FailDataFlow1 の値を False に切り替えて再実行すると、すべての行が到着したことを示すクエリでそれぞれ 3 と 7 の値が表示されました。

さまざまなコンテナー/実行可能ファイルのトランザクション オプションを変更することでさらに調査し、他の回答者が示したように機能していることを確認できます。

于 2012-04-29T18:56:07.403 に答える
0

必要なものを実現するには、トランザクション オプション =required をシーケンス コンテナーに設定し、すべてのデータフロー タスクに =supported を設定する必要があります。

私がいつもしていることは、トランザクションオプションを設定することです = パッケージレベルに必要で、他のすべてのタスクでサポートされています。そのため、タスクが失敗した場合、トランザクションはロールバックされます..

于 2012-04-29T07:13:12.523 に答える
0

あなたはほとんどすべてを正しく行っています。

まず、トランザクションの分離レベルを無視します。readcommited にバグがあり、やりたい場合は手動で行う必要があります。例については、この投稿の私の回答を参照してください。

しかし、分離レベルを構成する必要がある理由がわかりません。問題は明らかに分離レベルで解決できます。あなたが見逃しているのは、シーケンスコンテナでトランザクションを必須に設定することです。これらを [サポート] に設定すると、タスクはトランザクションを開始しませんが、親コンテナーが終了した場合は、その親コン​​テナーによって開始されたすべてのトランザクションに参加します。

そのため、トランザクションをシーケンス コンテナーで必須に設定し、データ フローでサポートすることで、機能するはずです。

于 2012-04-29T18:18:13.727 に答える