在SSIS包中的事務處理

2021-09-06 12:25:58 字數 2611 閱讀 7329

在處理ssis包的資料etl操作過程中,我們經常遇到的乙個問題就是一系列步驟在執行的過程中,如果中間的乙個步驟失敗了,那麼我們就需要清理前面已經執行過的步驟所產生的資料或者結果,這往往是乙個很頭疼的過程。那麼在ssis的package中是否可以實現事務機制呢?

我們知道基於事務我們可以保證在一系列操作下的各個步驟,它們要麼全部成功,要麼全部失敗。這裡將介紹在ssis的package中乙個比較簡單的實現方法。

首先,建立乙個測試表,這個表裡會有乙個自增的主鍵標識,然後分別有乙個文字和數字型別的字段。指令碼如下:

use [dbtest]

create table [dbo].[tbtest](

[id] [int] identity(1,1) not null,

[title] [nvarchar](50) null,

[amount] [decimal](18, 0) null,

constraint [pk_tbtest] primary key clustered

( [id] asc

)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]

) on [primary]

在ssis下新建立乙個package,然後加入如下三個步驟:

首先將資料表中的資料清空,然後insert幾條資料,最後嘗試進行乙個失敗的更新。

在load data步驟中,簡單的手動插入幾條資料。

資料來源語句的查詢。

然後在第三步更新資料的步驟中,我們嘗試對主鍵進行更新,這裡的目的主要就是要引發乙個異常然後讓後續介紹的事務進行回滾。

首先看一下直接執行的結果。

可以看到在第三步中觸發的異常。

並且在表中可以看到,資料確實沒有被回滾,還在表中。

接下來,我們開始嘗試在這個package中加入事務機制。

如上圖,ssis的這種模組化真的是非常好,相信大家一看這個圖就立刻明白接下來要做什麼了。

在begintran模組中的**:

begin transaction;

在committran模組中的**:

commit transaction;

最後,在roll back模組中的**:

rollback transaction;

然後,執行包。

發現在roll back模組中還是報錯了,錯誤資訊如下:

並且,事務沒有回滾。在表中還是可以看到被insert的資料。

這裡的關鍵在於,每乙個模組預設利用ssis裡的資料來源連線,都是重新開啟乙個新的連線,所以這樣在乙個新連線裡的rollback沒有前文,肯定是要失敗的。

所以,這裡需要關注ssis包資料來源連線的乙個屬性,就是retainsameconnection,它預設為false,把它設定成true,就可以保證在乙個包裡呼叫的資料來源連線都是同乙個連線。

設定好這個屬性之後,我們再來執行下包。

可以發現,當資料流在有異常被觸發的時候,roll back模組成功的進行了回滾。

從表中發現,資料確實被回滾了。

其實實現資料回滾的方法也很多,這是利用ssis自帶功能的乙個實現,他確實實現起來相對簡單一些。這樣可以避免包失敗後,重新執行包導致前面的步驟被重複執行。園子裡另外乙個兄弟bi work介紹的這篇文章利用check point來避免這種情況的發生。除此之外,也可以在設計package的時候,在包的開頭就設計好對可能影響到的資料的清理工作。總之實現的方法很多,在實際專案中完全可以根據實際的情況來決定使用哪乙個方案。

另外,在ssis中實際上也可以利用msdtc,但是它實現起來多少有一定的門檻,如果你對msdtc感興趣可以參考園子裡另外乙個朋友對它的介紹。

PHP MYSQLI中事務處理

mysql事務處理讓所有sql語句執行成功後才去處理,如果有一條沒有成功或者報錯就會回滾事務,防止敏感操作處理失敗。mysql中只有innodb和bdb型別的資料表才能支援事務處理!其它型別是不支援的!mysqli autocommit false 關閉自動提交功能 sql update users...

PHP MYSQLI中事務處理

mysql事務處理讓所有sql語句執行成功後才去處理,如果有一條沒有成功或者報錯就會回滾事務,防止敏感操作處理失敗。mysql中只有innodb和bdb型別的資料表才能支援事務處理!其它型別是不支援的!mysqli autocommit false 關閉自動提交功能 sql update users...

C 中的事務處理

一般的資料庫事務控制要求事務裡所做的操作必須在同乙個資料庫內,這樣在出現錯誤的時候才能回滾 rllback 到初始狀態。這就存在乙個問題,在分布式應用程式中,往往需要同時操作多個資料庫,使用資料庫本身的事務處理,很難滿足程式對事務控制的要求。在com 中,提供了完整的事務服務,可以利用它來完成在分布...