分散式事務
分散式事務
分散式事務是指事務的參與者、支持事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。
為了實現分散式事務,需要使用下面將介紹的兩階段提交協議。 * 階段一:開始向事務涉及到的全部資源發送提交前信息。此時,事務涉及到的資源還有最後一次機會來異常結束事務。如果任意一個資源決定異常結束事務,則整個事務取消,不會進行資源的更新。否則,事務將正常執行,除非發生災難性的失敗。為了防止會發生災難性的失敗,所有資源的更新都會寫入到日誌中。這些日誌是永久性的,因此,這些日誌會倖免於難並且在失敗之後可以重新對所有資源進行更新。 * 階段二:只在階段一沒有異常結束的時候才會發生。此時,所有能被定位和單獨控制的資源管理器都將開始執行真正的數據更新。在分散式事務兩階段提交協議中,有一個主事務管理器負責充當分散式事務協調器的角色。事務協調器負責整個事務並使之與網路中的其他事務管理器協同工作。為了實現分散式事務,必須使用一種協議在分散式事務的各個參與者之間傳遞事務上下文信息,IIOP便是這種協議。這就要求不同開發商開發的事務參與者必須支持一種標準協議,才能實現分散式的事務。
分散式事務處理 (TP) 系統旨在協助在分散式環境中跨異類的事務識別資源的事務。在分散式 TP 系統的支持下,應用程序可以將不同的活動合併為一個事務性單元,這些活動包括從“消息隊列”隊列檢索消息、將消息存儲在 Microsoft SQL Server 資料庫中、將所有現有的消息引用從 Oracle Server 資料庫中移除,等等。因為分散式事務跨多個資料庫資源,故強制 ACID 屬性維護所有資源上的數據一致性是很重要的。
在 Transact-SQL 中啟動的分散式事務的結構相對比較簡單:
1. Transact-SQL腳本或應用程序連接執行啟動分散式事務的 Transact-SQL 語句。
2. 執行該語句的 Microsoft® SQL Server™ 成為事務中的主控伺服器。
3. 然後腳本或應用程序對鏈接的伺服器執行分散式查詢,或對遠程伺服器執行遠程存儲過程。
4. 當執行了分散式查詢或遠程過程調用后,主控伺服器將自動調用 MS DTC 以便登記分散式事務中鏈接的伺服器和遠程伺服器。
5. 當腳本或應用程序發出 COMMIT 或 ROLLBACK 語句時,主控 SQL Server 將調用 MS DTC 管理兩階段提交過程,或者通知鏈接的伺服器和遠程伺服器回滾其事務。
控制分散式事務的 Transact-SQL 語句很少,因為多數工作都由 Microsoft® SQL Server™ 和 MS DTC 在內部完成。Transact-SQL 腳本或應用程序中所需的 Transact-SQL 語句只須:
●啟動分散式事務。
●對鏈接的伺服器執行分散式查詢,或對遠程伺服器執行遠程過程調用。
●調用標準 Transact-SQL COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION 或 ROLLBACK WORK 語句完成事務。
●對於任意一個 Transact-SQL 分散式事務,處理 Transact-SQL腳本或連接的 SQL Server 將自動調用 MS DTC 以協調事務的提交或回滾。
REMOTE_PROC_TRANSACTIONS 選項是一個兼容性選項,隻影響對使用 sp_addserver定義的遠程伺服器所進行的遠程存儲過程調用。有關遠程存儲過程的更多信息,請參見遠程存儲過程構架。該選項不適用於在使用 sp_addlinkedserver定義的鏈接伺服器上執行存儲過程的分散式查詢。有關分散式查詢的更多信息,請參見分散式查詢。
用 OLE DB、ODBC、ADO或 DB-Library 編寫的應用程序使用 Transact-SQL 分散式事務的方法可以是,發出 Transact-SQL 語句啟動和停止 Transact-SQL 分散式事務。但是,OLE DB 和 ODBC 還包含在 API 層對管理分散式事務的支持。OLE DB 和 ODBC 應用程序可以使用這些 API 函數管理包括其它 COM資源管理器(支持 MS DTC 事務而非 Microsoft® SQL Server™)的分散式事務。它們也可以使用 API 函數獲取對包括多個 SQL Server 的分散式事務邊界的更多控制。
ODBC 分散式事務
通過將連接特性 SQL_ATTR_AUTOCOMMIT 設置為 SQL_AUTOCOMMIT_OFF,然後調用 ODBC SQLEndTran函數提交或回滾每個事務,可以控制 ODBC API 層的本地事務。不要使用這些函數管理 ODBC 應用程序中的分散式事務。而應該使用 MS DTC COM 方法:
● 調用 DtcGetTransactionManager 連接到 MS DTC。
● 調用 ITransactionDispenser::BeginTransaction 啟動分散式事務並獲取事務對象。
● 對每個參與分散式事務的 ODBC 連接,調用 ODBC 函數 SQLSetConnectAttr,其中 fOption 設置為 SQL_COPT_SS_ENLIST_IN_DTC,vParam 控制來自 ITransactionDispenser::BeginTransaction 的事務對象的地址。
● 當事務完成時,對於從 ITransactionDispenser::BeginTransaction 獲得的事務對象,不要調用 ODBC SQLEndTran 函數,應該調用 ITransaction::Commit 或 ITransaction::Rollback 方法。
OLE DB 分散式事務
控制 OLE DB 中的分散式事務的方法與控制本地事務的方法相似。若要控制本地事務,則 OLE DB 的使用者應該:
● 使用 ITransactionLocal::StartTransaction 方法啟動本地事務,並獲得事務對象。
● 然後使用者在從 ITransactionLocal::StartTransaction 獲得的事務對象上,調用 ITransaction::Commit 或 ITransaction::Rollback 方法。
若要控制分散式事務,使用者應該: ● 調用 DtcGetTransactionManager 連接到 MS DTC。
● 調用 ITransactionDispenser::BeginTransaction 啟動分散式事務,並獲得事務對象。
● 對每個參與分散式事務的連接,調用分散式事務對象的 ITransactionJoin 介面。
● 調用分散式事務對象的 ITransaction::Commit 或 ITransaction::Rollback 方法,完成該事務。
Microsoft® SQL Server™ 允許創建與稱為鏈接伺服器的 OLE DB 數據源的鏈接。在鏈接到 OLE DB 數據源之後,可以:
● 從 OLE DB 數據源引用行集,作為 Transact-SQL 語句中的表。
● 將命令傳遞給 OLE DB 數據源,並包含結果行集,作為 Transact-SQL 語句中的表。
每個分散式查詢都可以引用多個鏈接的伺服器,而且可以對每個鏈接的伺服器分別執行更新或讀取操作。單個分散式查詢可以對某些鏈接的伺服器執行讀取操作,並且對其它鏈接的伺服器執行更新操作。通常情況下,每當某個事務可能更新多個鏈接伺服器中的數據時,Microsoft SQL Server 都要求相應的 OLE DB 提供程序支持分散式事務。因此,鏈接伺服器上所支持的查詢類型取決於 OLE DB 提供程序中對事務的支持級別。OLE DB 為事務管理定義了兩個可選的介面:
● ITransactionLocal 支持 OLE DB數據源中的本地事務。
● ITransactionJoin 允許提供程序聯結包含其它資源管理器的分散式事務。
● 所有支持 ITransactionJoin 的提供程序也都支持 ITransactionLocal。
如果在連接是自動提交模式時執行分散式查詢,則應用以下規則:
● 對於不支持 ItransactionLocal 的提供程序,只允許執行讀取操作。
● 對於支持 ITransactionLocal 的提供程序,允許執行所有更新操作。
● 主控 SQL Server 會自動調用每個參與更新操作的鏈接的伺服器中的 ITransactionLocal,以啟動本地事務,並在語句執行成功時提交或在語句執行失敗時回滾。
如果分散式查詢是針對分散式分區視圖或者是在連接為顯式或隱性事務時執行,則應用下列規則:
● 對於不支持 ITransactionJoin 的提供程序,只允許執行讀取操作。不支持任何事務或只支持 ITransactionLocal 的提供程序不能參與更新操作。
● 如果 SET XACT_ABORT 設置為 ON,則對於支持 ITransactionJoin 的任意提供程序都允許執行所有的更新操作。主控 SQL Server 會自動調用每個參與更新操作的鏈接伺服器中的 ITransactionJoin,以便在分散式事務中登記該伺服器。然後當主控伺服器表示要提交或回滾事務時,MS DTC 將提交或者回滾。
● 如果 SET XACT_ABORT 設置為 OFF,則鏈接伺服器還必須支持嵌套事務,才能對其執行更新操作。當會話已經有一個現有事務時,如果提供程序支持調用 ITransactionLocal::StartTransaction,則支持嵌套事務。這使 SQL Server 得以回滾分散式查詢中的單個語句,而不是回滾整個事務。
上述規則意味著提供程序的下列限制不支持嵌套事務:僅在 XACT_ABORT 選項設置為 ON 時,分散式事務中才允許更新操作。