分散式事務

分散式事務是指事務的參與者、支持事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。

概念

為了實現分散式事務,需要使用下面將介紹的兩階段提交協定。 * 階段一:開始向事務涉及到的全部資源傳送提交前信息。此時,事務涉及到的資源還有最後一次機會來異常結束事務。如果任意一個資源決定異常結束事務,則整個事務取消,不會進行資源的更新。否則,事務將正常執行,除非發生災難性的失敗。為了防止會發生災難性的失敗,所有資源的更新都會寫入到日誌中。這些日誌是永久性的,因此,這些日誌會幸免於難並且在失敗之後可以重新對所有資源進行更新。 * 階段二:只在階段一沒有異常結束的時候才會發生。此時,所有能被定位和單獨控制的資源管理器都將開始執行真正的數據更新。 在分散式事務兩階段提交協定中,有一個主事務管理器負責充當分散式事務協調器的角色。事務協調器負責整個事務並使之與網路中的其他事務管理器協同工作。 為了實現分散式事務,必須使用一種協定在分散式事務的各個參與者之間傳遞事務上下文信息,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 時,分散式事務中才允許更新操作。

相關詞條

相關搜尋

熱門詞條

聯絡我們