共用方式為


使用單階段提交和可提升的單階段通知進行優化

本主題描述基礎結構所提供的 System.Transactions 機制,以將效能優化。

可擢升的單一階段招募

基礎結構會 System.Transactions 管理單一應用程式域內的交易,其中最多牽涉到單一永久性資源或多個變動性資源。 System.Transactions由於基礎結構只會使用應用程式內部網域呼叫,因此會產生最佳的輸送量和效能。

不過,如果交易被提供給同一台計算機上的另一個應用程式域中的另一個物件(包括橫跨進程和機器邊界),或您需要註冊另一個可靠的資源管理員,System.Transactions 基礎架構會自動將交易升級交由 MSDTC 管理。 由 MSDTC 所管理的交易在效能上不如由System.Transactions基礎結構所管理的交易。

為了優化效能,System.Transactions 基礎結構會提供可提升的單一階段註冊(PSPE),讓位於不同應用程式域、進程或機器的單一遠端耐久資源參與 System.Transactions 交易,而不會將其升級為 MSDTC 交易。 此資源管理員(RM)可以管理並「擁有」一筆交易,這筆交易在必要時可以升級為分散式交易(或 MSDTC 分散式交易)。 這可減少使用 MSDTC 的機會。

這個特定的資源管理器通常有自己的內部非分散式交易,並且需要支援在執行時將這些交易轉換成分散式交易。 例如,SQL Server 2005 是這樣的資源管理員。 在此情況下,System.Transactions 基礎結構採取被動管理角色,只需監視交易並在需要時進行升級。 若要支援基礎結構與資源管理員之間的 System.Transactions 互動,後者必須實作 介面 IPromotableSinglePhaseNotification

方法 EnlistPromotableSinglePhase 可用來註冊可以升級的單一持久資源。 此方法可確保徵兵活動可以根據需要升級。 如果登記成功,RM 會建立其內部交易,並將它與 System.Transactions 交易產生關聯。 如果 PSPE 登記失敗,RM 應該改用 EnlistDurable 方法登記。 在 PSPE 中登記失敗的情況可能發生在以下條件下:當交易已經是分散式交易,或當另一個 RM 已經進行了 PSPE 登記時。

一旦登記後,客戶端的認可或中止 System.Transactions 交易呼叫,會被分別轉換為資源管理器中透過呼叫SinglePhaseCommit 方法或Rollback 的呼叫。

System.Transactions如果交易永遠不需要升級,當交易被認可時,RM 會收到SinglePhaseCommit通知。 接著,它可以提交最初建立的內部交易。

如果需要將System.Transactions交易升級(例如,支援多個 RM),System.Transactions會通過在Promote介面上呼叫ITransactionPromoter方法來通知資源管理員,而Promote介面是從介面衍生的。 然後,資源管理員會將本機交易(不需要記錄日誌)內部轉換成能夠參與 DTC 交易的交易物件,並將它與已完成的工作產生關聯。 當要求交易提交時,交易管理員仍會將 SinglePhaseCommit 通知傳送給資源管理員,以提交其在升級過程中建立的分散式交易。

備註

TransactionCommitted這些追蹤(在升級交易中呼叫提交時產生的)包含 DTC 交易的活動 ID。

如需管理升級的詳細資訊,請參閱 交易管理升級

交易管理升級方案

下列情境示範了一個將 System.Data 命名空間作為資源管理員的代理來升級為分散式交易的過程。 此案例假設已經有一個 System.Data 與資料庫 CN1 連線,涉及交易,而應用程式想要牽涉到另一個 System.Data 連線 CN2。 交易必須呈報至 DTC,做為完整分散式雙階段認可交易。

在此案例中,

  1. CN1 會呼叫 EnlistPromotableSinglePhase 方法來登記交易。 然後,交易仍然是本機的,而且交易上沒有其他可促銷的登記,因此 EnlistPromotableSinglePhase 呼叫會成功。

  2. 當第二個連線時,CN2 會呼叫 EnlistPromotableSinglePhase,呼叫會失敗,因為涉及另一個可提升登記。 因此,CN2 必須取得 DTC 交易,才能將它傳遞至 SQL。 若要這樣做,它會使用 類別所提供的 TransactionInterop 其中一種方法來產生可提供給 SQL 之交易的格式。

  3. System.Transactions 呼叫 CN1 所實作的 Promote 介面上的 ITransactionPromoter 方法。

  4. 此時,CN1 會使用 SQL 2005 和 System.Data 的某些特定機制來升級交易。

  5. 方法的 Promote 傳回值是一個位元組陣列,其中包含交易的傳播令牌。 System.Transactions 使用此傳播令牌來建立 DTC 交易,並將其納入本地交易中。

  6. 此時,CN2 可以使用 從呼叫其中一種方法 TransactionInterop 所收到的數據,將交易傳遞至 SQL。

  7. 現在,兩者都會註冊在 DTC 的分散式交易中。

單階段提交優化

單相提交協定在執行時效率更高,因為所有更新皆無需明確協調。 若要利用這項優化,您應該使用 ISinglePhaseNotification 資源介面實作資源管理員,並使用 EnlistDurableEnlistVolatile 方法在交易中登記。 具體來說,EnlistmentOptions 參數應設為 None 以確保執行單階段提交。

ISinglePhaseNotification由於介面衍生自 IEnlistmentNotification 介面,如果您的 RM 不符合單一階段認可資格,它仍然可以接收兩個階段認可通知。 如果您的 RM 收到SinglePhaseCommit來自 TM 的通知,它應該嘗試執行認可所需的工作,以便決定是否認可,並且對應地通知交易管理器是否需要認可或回復,這可以通過在參數Committed上呼叫AbortedInDoubtSinglePhaseEnlistment方法來完成。 此階段中登記的回應 Done 表示 ReadOnly 語意。 因此,除了任何其他方法之外,您不應該回復 Done

如果只有一個揮發性登記且沒有永久性登記,則揮發性登記會收到 SPC 通知。 如果有任何揮發性登記,而且只有一個永久性登記,則揮發性登記會收到 2PC。 完成後,穩定性服役者將獲得 SPC。

另請參閱