SSIS事務


事務用於處理數據的一致性,事務的定義是,處於同一個事務中的操作是一個工作單元,要么全部執行成功,要么全部執行失敗。

SSIS默認支持Task組件級別的事務,在默認情況下,單個Task組件在開始執行時,會打開連接,開啟一個事務,等到Task組件執行完成,提交事務,關閉連接。

SSIS支持的事務

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

  • 本機事務(多Task組件,單一連接,單一事務):是SQL Server引擎級別事務,通過TSQL事務命令管理的單一連接的事務處理;
    (讓Package使用本機事務的關鍵是所有的任務組件都使用相同的連接管理器,並且連接管理器(Connection Manager)上的屬性RetainSameConnection設置為True。如果連接管理器的屬性RetainSameConnection值是False,那么每個Task組件在開始執行時,打開連接,在組件結束時,關閉連接。在組件執行結束時,如果存在未提交的事務,那么組件會自動回滾Task組件的TSQL查詢語句。由於每個組件都會打開和關閉連接,即使兩個組件,使用的是同一個連接管理器,它們使用的連接都是不同的。如果連接管理器的屬性RetainSameConnection值是true,那么連接管理器會保持打開,直到Package結束,連接才會關閉。在連接關閉時,SSIS引擎會檢查連接中是否存在未提交的事務,如果存在,執行事務回滾。)

  • 分布式事務(多Task組件,多連接,單一事務):通過分布式事務協調器(DTC,Distributed Transaction Coordinator) 實現跨連接,Task和Package的事務處理;
    (本機事務只能使用單一連接,在同一個連接中通過TSQL命令執行事務處理,不能實現跨連接,不能跨數據庫的事務,由於SSIS經常需要處理多個數據庫的數據,本機事務無法實現跨數據庫的事務處理,用戶可以通過MS DTC(微軟分布式事務服務)實現分布式事務處理。)

在SSIS 引擎服務器上啟用MS DTC服務,並在Package的Task組件上設置相應的TransactionOption,就能使用分布式事務。
每個可執行組件(Task或Container)都包含Transactions屬性組,SSIS通過這兩個屬性實現事務處理:
IsoLationLevel:設置事務的隔離級別;
TransactionOption:設置事務選項;(選中task或者contain,點解F4打開屬性)

  • Supported:如果已經存在一個事務,那么當前組件加入到事務中;
  • Not Supported:即使存在一個事務,當前組件也不會加入到事務中;
  • Requried:如果存在事務,那么當前組件加入到事務中;如果不存在事務,那么啟動一個事務。

上圖中,container設置位Supported,第一個task設置為Required,表示啟動一個事務,第二個task設置為Supported,表示加入到task1的事務中。
第二個container是相同的設置。這兩個container各自擁有一個單獨的事務,互不影響。

下圖是來源於http://blog.sina.com.cn/s/blog_72d3486f0102w2hh.html,
AA,BB,CC,DD都是插入語句操作,DD插入語句有個錯誤。

分布式事務報錯

OLE DB provider "SQLNCLI11" for linked server "dbLink01" was unable to begin a distributed transac
如果分布式事務報錯,可以嘗試從以下幾個方面進行解決。

  • 檢查本地機器與目標機器的MSDTC(Distributed Transaction Coordinator)服務是否已經啟用

  • MSDTC設置

  • 打開雙方服務器,再打開SSMS,右擊數據庫服務器屬性,在連接選項卡勾選"需要將分布式事務用於服務器到服務器的通信." 重啟雙方數據庫服務。

  • 檢查兩台機器能夠相互ping通Hostname。注意是機器名,而不是IP。
    (若不可以,進行如下設置:在目錄“C:\Windows\System32\drivers\etc”下的hosts文件,寫上IP和HostName的對應信息,如 “10.211.11.111 ABCD”。

  • 打開雙方135端口
    MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135端口,保證RPC服務啟動,如果服務器有防火牆,保證135端口不被防火牆擋住。 使用“telnet IP 135 ”命令測試對方端口是否對外開放。也可用端口掃描軟件(比如Advanced Port Scanner)掃描端口以判斷端口是否開放

  • 允許msdtc服務通過防火牆,沒有該選項時,通過點擊【允許運行另一程序】按鈕添加,位置為C:\Windows\System32\msdtc.exe。或者直接關閉防火牆也可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM