共用方式為


實作資源管理器

交易中使用的每個資源都是由資源管理員管理,其動作會由交易管理員協調。 資源管理員會與交易管理員合作,為應用程式提供原子性和隔離性的保證。 Microsoft SQL Server、永久性消息佇列、記憶體內部哈希表都是資源管理員的範例。

資源管理員會管理永久性或揮發性數據。 資源管理員的持久性(或相反的波動性)是指資源管理員是否支援失敗復原。 如果資源管理員支援失敗復原,它會在第一階段(準備)期間將數據保存到永久存儲,這樣如果資源管理員關閉,就可以在復原時重新加入交易,並根據從交易管理員收到的通知執行適當的動作。 一般而言,揮發性資源管理員會管理動態資源,例如記憶體內部數據結構(例如記憶體內部交易哈希表),而長期資源管理員會管理具有更持續性備份存放區的資源(例如,備份存放區是磁碟的資料庫)。

為了讓資源參與交易,它必須在交易中註冊。 該 Transaction 類別定義了一組名稱以 S Enlist 開頭的方法,提供此功能。 不同的 Enlist 方法對應資源管理者可能擁有的不同類型的招募方式。 具體來說,您會使用 EnlistVolatile 動態資源的方法,以及 EnlistDurable 長期資源的方法。 為了簡單起見,在決定是否根據資源的持久性支援使用 EnlistDurableEnlistVolatile 方法之後,您應該透過實作 IEnlistmentNotification 介面以資源管理員的身份登記您的資源,以參與兩階段提交(2PC)。 如需 2PC 的詳細資訊,請參閱 Single-Phase 和多階段交易提交

藉由註冊,資源管理者可確保在交易提交或中止時,能從交易管理者收到回調通知。 每次登記都有一個IEnlistmentNotification例。 一般而言,每個交易都有一個登記,但資源管理員可以選擇在同一筆交易中多次登記。

登記之後,資源管理員會回應交易的要求。 長期資源管理員會儲存足夠的資訊,讓它能夠復原或重做其所管理之資源的交易工作。 有許多方法可以執行此動作:保留數據版本或保留變更的記錄是兩種常見的技術。

當應用程式認可交易時,交易管理員會起始兩階段認可通訊協定。 交易管理員會先詢問每個登記的資源管理員是否準備好認可交易。 資源管理員必須準備提交或中止交易,因為它正在為這兩個可能結果做好準備。

在準備階段期間,長期資源管理員會記錄穩定記憶體中的舊數據和新數據,讓資源管理員即使系統失敗也能復原。 如果資源管理員可以準備,它會通知交易管理員它對是否提交或中止交易的投票意見。 如果有任何資源管理員回報準備失敗,交易管理員會將回滾命令傳送給每個資源管理員,並通知應用程式認可操作失敗。

備妥之後,資源管理員必須等到第 2 階段從交易管理員收到了認可指令或中止指令的回呼函式通知為止。 一般而言,整個準備和提交協議通常在一秒內完成。 如果系統或通訊失敗,認可或中止通知可能不會送達數分鐘或數小時。 在此期間,資源管理員對交易的結果表示懷疑。 它不知道交易是否已認可或中止。 雖然資源管理員對交易持懷疑態度,但它會藉由將交易保持鎖定來保留修改數據,藉此將這些變更與任何其他交易隔離。

當資源管理員失敗時,其所有登記的交易都會中止,但失敗前已備妥或認可的交易除外。 當長期資源管理員重新啟動時,它會藉由擷取準備階段中寫入的準備資訊,重新建構其所管理之資源的認可狀態,並據以認可或中止這些交易。

總而言之,兩階段提交協議和資源管理員結合,使交易具備原子性和持久性。

類別 Transaction 也提供方法 EnlistPromotableSinglePhase 來登記可提升單一階段登記 (PSPE)。 這可讓長期資源管理員 (RM) 裝載並「擁有」交易,之後可以視需要升級為由 MSDTC 管理。 如需進一步資訊,請參閱 單階段提交和可促進的單階段通知優化方法

本節中

下列主題概述資源管理員通常遵循的步驟。

將資源招募為交易中的參與者

描述永久性或揮發性資源如何參加交易。

提交在 Single-Phase 和多階段的交易

描述資源管理員如何回應提交通知並準備提交。

執行復原

描述長期資源管理員如何從失敗中復原。

存取資源的安全性信任層級

描述 System.Transactions 的三種信任層級如何限制對公開的資源 System.Transactions 類型進行存取。

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

描述資源管理員實作可用的優化做法。