2012-04-29 109 views
4

我有一個包含3個並行數據流任務的包添加到序列容器中。我需要實現事務,如果所有3個數據流任務都成功執行,則事務完成。如果任何數據流任務失敗,則事務應該回滾。如何在同一事務中並行運行多個數據流任務?

我正在測試這個軟件包,但它不工作。

  • 我花了一sequence container和拖放data flow task 1data flow task 2data flow task 3和配置的所有三個數據流任務。

  • 在sequencee容器的屬性,我已經設置了以下屬性

    Transaction: supported

    Isolation: readcommited

  • 在三個數據流任務的屬性,我已經設置了以下屬性

    Transaction: supported

    Isolation: readuncommited

  • 當運行該程序包,所述數據流任務1失敗,但數據轉換成數據流任務2仍然被插入並提交。

如何防止數據流任務提交事務,即使其中一個數據流任務失敗?

+0

你在D(編程語言)中做你的項目嗎? o.O – DejanLekic 2012-04-29 10:37:29

回答

0

您必須設置序列容器所需的事務選項=和所有數據流任務所支持的=來實現您所需要的。

我總是做的是設置事務選項=所需的包裝水平,並支持所有其他tasks.So,如果任何任務失敗事務回滾..

+0

我遵循你曾經給過的任何指示,但它沒有工作。那時候所有的任務好行也是它的失敗.plz告訴我如何實現。 – user1363759 2012-04-29 09:09:43

+0

我遵循任何你給的指示,但它不工作。那時如果好的行來源的水平,那時它的成功。假設任何任務失敗的時候它不回滾.plz如何我acchive。 – user1363759 2012-04-29 09:37:52

0

你正在做的幾乎一切正常。

首先,忽略事務隔離級別,它有一個readcommited的錯誤,如果你想這樣做,你必須手動完成它,看看我的回答this後作爲例子。

但我不明白你爲什麼要配置隔離級別,你的問題顯然可以用隔離級別來解決。缺少的東西是將事務設置爲序列容器上的必需項。將它們設置爲Supported表示該任務不會啓動事務,但會加入由其父容器啓動的任何事務(如果它退出)。

因此,通過將事務設置爲序列容器上的必需條件並支持數據流,它應該可以工作。

4

我同意其他答案,您的問題需要您將封閉容器上的交易範圍設置爲Required。除非您更改了內部對象,否則它們的默認交易級別爲Supported,這意味着它們將在可用的交易中登記。 A Required設置將開始一個事務並且爲了完整性,NotSupported指示可執行程序/容器將忽略可能導致死鎖的任何現有事務,具體取決於您的設計。

我構建了一個樣本包,用於刪除並重新創建目標表以驗證事務是否按預期行事。包中有3個數據流,每個數據流都向表(1,2,4)添加一個唯一值,以便像這樣的查詢將指示值是否到達目標表。

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

正如你所看到的,有7個變量,成對3個。名爲的FailDataFlow是布爾值,允許任何獨特的數據流失敗/成功。這是通過在相應查詢的where子句中引起0除法異常來實現的。

data flow description

序列容器具有一個Required的TransactionOption。各個數據流保留默認的TransactionOption Supported.

第一次執行導致無法與分佈式事務協調器進行通信,因爲它在此VM上被設置爲手動啓動。糾正這個問題導致軟件包正確地失敗,因爲「DFT值2」產生一個零除異常。運行上述查詢方式,即使在「DFT值1」上存在綠色框,我的表格中也沒有顯示任何內容。

enter image description here

FailDataFlow1的值轉換爲False,重新運行分別顯示在我的查詢這表明所有行抵達的3和7的值。

您可以通過更改各種容器/可執行文件上的事務選項來進一步探索,以確保他們正在像其他受訪者指示的那樣工作。

相關問題