當前位置:
首頁 > 知識 > SSIS 事務處理

SSIS 事務處理

事務用於處理數據的一致性,處於同一個事務中的操作是一個工作單元,要麼全部執行成功,要麼全部執行失敗。SSIS默認支持Task組件級別的事務。在默認情況下,單個Task組件在開始執行時,會打開連接,開啟一個事務,等到Task組件執行完成,提交事務,關閉連接,也就是說,默認情況下,單個Task組件在單個事務中執行查詢,因此,在單個Execute
SQL
Task組件中執行大量的TSQL腳本,不是明智的選擇,因為,這會導致日誌文件的激增。如果Task組件執行失敗,SSIS引擎自動進行回滾Task級別上的事務。如果在Task中使用begin
tran命令開啟一個顯式事務,必須在組件中顯式提交事務;當執行顯式事務的組件失敗時,組件會回滾顯式事務。SSIS支持更複雜的事務處理,包括單一連接的本機事務,和跨連接的分散式事務處理。

一,SSIS支持的事務

在SSIS Package中,按照事務的分布性,可以把事務分為兩種類型:

  • 分散式事務:通過分散式事務協調器(DTC,Distributed Transaction
    Coordinator) 實現跨連接,Task和Package的事務處理;

  • 本機事務:是SQL
    Server引擎級別事務,通過TSQL事務命令管理的單一連接的事務處理;

事務處理,都依賴連接管理器的支持。讓Package使用本機事務的關鍵是所有的任務組件都使用相同的連接管理器,並且連接管理器(Connection
Manager)上的屬性RetainSameConnection設置為True:

SSIS 事務處理

讓Package使用分散式事務的關鍵是所有的任務組件使用的連接管理器都支持DTC事務,並且連接管理器的SupportsDTCTransactions屬性值都為True:

SSIS 事務處理

二,單個Task組件的事務處理

最常用的Task組件是Execute SQL
Task組件,在該組件中執行的TSQL腳本處於同一個事務中。在該Task組件執行時,打開連接,開啟一個事務,直到所有的TSQL腳本都成功執行,組件執行成功;一旦該Task中的某個TSQL腳本執行失敗,事務回滾,這意味著,該Task中的所有已經執行的TSQL腳本都將回滾。因此,在單個Execute
SQL Task組件中執行大量的TSQL腳本,不是明智的選擇,因為,這會導致日誌文件的激增。

創建測試表,測試表只有一列:

create table dbo.dt_test

在Execute SQL Task組件中執行以下語句:

insert into dbo.dt_test

Task組件執行失敗,從資料庫中查看,測試表中沒有插入任何數據,這說明,單個Task中的所有TSQL語句都包含在單個事務中。

三,本機事務處理(多Task組件,單一連接,單一事務)

在SSIS的任務和容器組件中,很多操作都需要連接到資料庫執行查詢,使用本機事務處理的關鍵是,所有的任務組件都使用相同的連接管理器,並且設置連接管理的屬性RetainSameConnection為True,其默認值是False。

如果連接管理器的屬性RetainSameConnection值是False,那麼每個Task組件在開始執行時,打開連接,在組件結束時,關閉連接。在組件執行結束時,如果存在未提交的事務,那麼組件會自動回滾Task組件的TSQL查詢語句。由於每個組件都會打開和關閉連接,即使兩個組件,使用的是同一個連接管理器,它們使用的連接都是不同的。

案例1:有兩個組件,在一個組件中創建一個臨時表或臨時變數,在另一個組件中是不能使用的,這是因為在第一個組件結束時,連接也被關閉,臨時表或臨時變數的生命周期結束。

案例2:在循環任務中連接資料庫時,設置RetainSameConnection值是True,能夠避免頻繁地打開/關閉連接。在Package開始執行時,打開連接,package結束時,關閉連接,保證所有task組件使用的都是同一個連接。

如果連接管理器的屬性RetainSameConnection值是true,那麼連接管理器會保持打開,直到Package結束,連接才會關閉。在連接關閉時,SSIS引擎會檢查連接中是否存在未提交的事務,如果存在,執行事務回滾。

案例3:有兩個組件,使用的是同一個連接管理器,屬性RetainSameConnection值是true。在一個組件中創建一個臨時表或臨時變數,在另一個組件中可以使用,這是因為在第一個組件結束時,連接沒有被關閉,兩個組件使用的是同一個連接,臨時表或臨時變數的生命周期會持續到Package結束。

案例4:將連接管理器的屬性RetainSameConnection設置為true,在上游組件中開啟事務,在下游組件中提交事務,實現本機事務處理。

示例,利用TSQL命令(begin/commit/rollback
tran)實現事務的提交或回滾

Package的設計如下圖所示:

SSIS 事務處理

Exec TSQL組件執行的TSQL語句是:dbo.dt_test只有一列
ID,是int類型,該組件會執行失敗。

insert into dbo.dt_test

case1,設置連接管理器的RetainSameConnection屬性值為False,rollback
tran組件執行報錯

SSIS 事務處理

從Progess選項卡中,查看Exec TSQL組件拋出的錯誤消息是:

insert into dbo..." failed with the following error: "Conversion
failed when converting the varchar value "a" to data type int.".

rollback tran 組件拋出的錯誤消息是:

[Execute SQL Task] Error: Executing the query "rollback tran"
failed with the following error: "The ROLLBACK TRANSACTION request has no
corresponding BEGIN TRANSACTION.".

分析:由於連接管理器的屬性RetainSameConnection為False,每個Task組件都是單獨打開和關閉連接,begin
tran組件已經把顯式事務提交,rollback tran組件沒有begin tran子句,無法執行事務回滾。

case2,設置連接管理器的RetainSameConnection屬性值為True

1,設置連接管理器的RetainSameConnection屬性值為True,rollback
tran組件執行報錯

把連接管理器的屬性RetainSameConnection設置為True,使所有的Task組件使用的連接都是相同的。再次執行Package,還是失敗,錯誤原因是:

[Execute SQL Task] Error: Executing the query "rollback tran"
failed with the following error: "The ROLLBACK TRANSACTION request has no
corresponding BEGIN TRANSACTION."

SSIS 事務處理

這是由於Execute SQL Task 在失敗時,SSIS引擎自動進行事務的回滾。

這個結論可以通過增加一個Insert 1 組件來實現,向測試表中插入數值1,代碼如下:

insert into dbo.dt_test

SSIS 事務處理

在Exec
TSQL組件上添加OnPostExecute斷點,在Task執行之後,拋出錯誤之前,停止程序的運行:

SSIS 事務處理

重新執行Package,在執行到斷點時,測試表已經插入的數值1 被刪除,這說明,Exec
TSQL組件的失敗,會導致整個事務自動回滾。

結論1:當Execute SQL Task執行失敗時,SSIS自動進行事務的回滾,但是當Execute SQL
Task執行成功時,不會自動提交顯式事務;開啟一個顯式事務,必須顯式提交事務。

2,開啟一個顯式事務,需要顯式提交事務

把Exec TSQL執行的語句修改插入數值2,這樣,組件執行成功:

insert into dbo.dt_test

SSIS 事務處理

如果把commit
tran組件禁用,Package執行成功,但是測試表中沒有插入任何數據,這說明,Package執行完成之後,連接管理器檢測到有未提交的事務,自動把未提交的事務回滾。下圖所示,事務並沒有提交成功,而是被回滾。

SSIS 事務處理

結論2:開啟一個顯式事務,需要顯式提交事務。當連接關閉時,SSIS會回滾未提交的顯式事務。SSIS會檢查每一個連接內是否存在未提交的顯式事務,如果存在,那麼回滾該事務;對於隱式事務,當TSQL語句執行結束時,會自動提交或回滾。

四,分散式事務處理(多Task組件,多連接,單一事務)

本機事務只能使用單一連接,在同一個連接中通過TSQL命令執行事務處理,不能實現跨連接,不能跨資料庫的事務,由於SSIS經常需要處理多個資料庫的數據,本機事務無法實現跨資料庫的事務處理,用戶可以通過MS
DTC(微軟分散式事務服務)實現分散式事務處理。

在SSIS 引擎伺服器上啟用MS
DTC服務,並在Package的Task組件上設置相應的TransactionOption,就能使用分散式事務。

每個可執行組件(Task或Container)都包含Transactions屬性組,SSIS通過這兩個屬性實現事務處理:

  • IsoLationLevel:設置事務的隔離級別;

  • TransactionOption:設置事務選項;

  • Supported:如果已經存在一個事務,那麼當前組件加入到事務中;

  • Not Supported:即使存在一個事務,當前組件也不會加入到事務中;

  • Requried:如果存在事務,那麼當前組件加入到事務中;如果不存在事務,那麼啟動一個事務。

案例:兩個Task,一個事務

在單一Package的不同Task組件中引用分散式事務,簡化的設計如下圖,兩個Task組件使用不同的連接管理器:

SSIS 事務處理

設置Required組件的TransactionOption屬性為Required,開啟一個分散式事務處理:

SSIS 事務處理

設置Supported組件的TransactionOption屬性為Supported,加入到當前的事務中,這就意味著,一個事務就包含兩個Task,兩個連接:

SSIS 事務處理

這樣設置之後,在同一個Package的不同的Task組件中,一個跨連接的分散式事務處理建立完成。

分散式事務處理,還支持多Package,多連接,單一事務模式,不再贅述。

文章來源:博客園


中公優就業IT培訓,總有你想學的:http://xue.ujiuye.com

勤工儉學計劃,0元學IT!

http://www.ujiuye.com/zt/qgjx/?wt.bd=mmxtt

找工作太難?好漢,讓我助你一臂之力!

http://www.ujiuye.com/zt/jyfc/?wt.bd=mmxtt

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

Qt5.8以上版本編譯Oracle資料庫的OCI驅動教程
Entity Framework Core 2.0 新特性
Node.js簡介
mybatis 詳解——一級緩存、二級緩存
ETL作業調度工具TASKCTL的兩個重大突破

TAG:IT優就業 |

您可能感興趣

TIPS 泥鰍處理方法
JSP Cookie 處理
OOR主唱TAKA戀情曝光!事務所:私事交由本人處理…
iSIM技術把SIM卡內嵌到處理晶元 比eSIM更省空間
【ASP.NET Core】處理異常
開源RISC-V架構正在改變IoT處理器的遊戲規則
大數據處理就用POWER QUERY
信號處理頂會 ICASSP 開幕,俞棟張長水周彤榮升 IEEE Fellow
Android PMS處理APK的複製
PS—超簡單的LOMO照片處理
從DSP處理到車載多媒體中心,GS8 Plus教你如何選購DSP功放
研究員發現SEV加密虛擬化安全漏洞AMD EPYC及Ryzen Pro處理器遭殃
JSP 日期處理
FEEDER MARK識別NG處理
獨家 | 信號處理頂會 ICASSP 開幕,俞棟張長水周彤榮升 IEEE Fellow
外媒曝PS5採用AMD8核Zen處理器
一窺ARM的AI處理器
一窺ARM的AI處理器
低功耗處理器之王的恐懼,ARM關閉嘲諷RISC-V的網站
常用EXCEL函數——清洗處理類