2017-08-24 77 views
0

我創建了一個SSIS 2012包,其中爲循環容器計劃連續運行(無限循環),以便它可以處理傳入的Excel文件,只要它被放入指定放下目錄。處理過程首先清除目標SQL Server 2012數據庫表中的所有現有記錄,然後將Excel中的數據批量插入到表中。所以顯然它需要維護事務,以便在批量插入失敗的情況下(由於無效的文件數據等),數據刪除操作可以被回滾。SSIS - Sql事務回滾拋出錯誤

以下是在for循環容器的任務:

  1. 腳本任務利用的是C#FileSystemWatcher的看一個Excel文件下降到Drop文件夾。

  2. 與下面的語句執行SQL任務

BEGIN TRANSACTION TRAN1;

  • 數據流任務用Excel源和目的地OLEDB從Excel數據插入到SQL Server數據庫表。此任務具有一個OnError錯誤處理程序,它使用執行SQL任務將錯誤詳細信息記錄到用戶定義的錯誤日誌表中。

  • 在上述的成功優先約束,一個與下面的語句執行SQL任務

  • 提交事務TRAN1;

  • 論的上述第3項的故障優先約束,一個與以下語句執行SQL任務
  • 回滾事務TRAN1;

    請注意,由於MSDTC未在數據庫服務器中啓用,因此我無法使用基於默認DTC的事務。因此使用本地SQL事務。另外,我在所有數據庫相關任務中使用了一個OLEDB連接管理器(這是一個遠程Sql Server數據庫,因此使用了OLE DB)。 Oledb連接管理器的RetainSameConnection屬性設置爲True。此外,所有與數據庫相關的任務都將其事務選項設置爲支持。 然而,與具有無效數據的一個輸入Excel文件運行程序包,爲回滾任務#5拋出以下錯誤,並且在同一記錄到錯誤日誌表:

    回滾事務請求有沒有相應的BEGIN TRANSACTION

    我應該補充一點,對於一個有效的Excel文件,該包可以在Commit Transaction(任務4)正常完成的情況下正常運行。 任何想法可能導致事務回滾拋出錯誤?

    +0

    我懷疑這個交易在SSIS中是這樣工作的。開始事務範圍是一項任務,要麼試圖以不同的方式提交/回滾。 – Rex

    +0

    這就是連接管理器的RetainSameConnection屬性設置爲true並且所有任務使用相同的連接管理器的原因。 – fuzzygeek

    +0

    此外,我最初創建了沒有for循環容器的包,並且沒有用於DFT的OnError錯誤處理程序,並且當時提交事務和回滾事務任務都成功運行。因此,只要RetainSameConnection爲true,就可以在一個任務中開始事務並在另一個任務中提交/回滾。 – fuzzygeek

    回答

    0

    我能夠通過將故障優先約束從DFT更改爲回滾EST從邏輯與到邏輯或來解決此問題。