共用方式為


建立資源管理器

資源管理員 維護每個交易的數據,並記錄交易的作業。 如果交易處理系統(TPS)有多個資源管理員,則每個資源管理員都可以參與每個交易的提交、回滾和復原作業。

每個資源管理員都必須匯出交易式用戶端可用來存取資料庫或資源管理員所維護的其他資源介面。

一般而言,內核模式資源管理員必須依照列出的順序執行下列工作:

  1. 建立記錄數據流。

    資源管理員可以使用 Common Log File System (CLFS) 或其他一些記錄功能來維護其記錄數據流。 呼叫 ClfsCreateLogFile 會建立 CLFS 記錄數據流。 資源管理員必須使用記錄數據流來記錄認可、回復或復原交易所需的任何資訊。 此外,KTM 會使用記錄數據流來記錄任何可能需要復原交易的內部狀態變更。

  2. 建立交易管理員物件。

    ZwCreateTransactionManager 的呼叫 會建立交易管理員物件,並將資源管理員連接到資源管理員指定的其他 CLFS 記錄數據流。

  3. 復原交易管理員狀態。

    ZwRecoverTransactionManager 的呼叫 會讀取交易管理員對象的記錄數據流(KTM 維護的記錄數據流),並判斷 TPS 是否在完成所有交易之前關閉(例如,因為系統當機)。 KTM 會根據記錄數據流中的資訊還原其內部狀態。

  4. 建立 Resource Manager 物件。

    ZwCreateResourceManager 的呼叫 會建立資源管理員物件,並將它與先前建立的交易管理員對象產生關聯。

  5. 復原資源管理員狀態。

    ZwRecoverResourceManager 的呼叫 將會使 KTM 傳送 TRANSACTION_NOTIFY_RECOVER 通知,針對上次資源管理員關機時正在進行的所有交易。 如需資源管理員應如何回應這些通知的資訊,請參閱 處理復原作業

  6. 從用戶端接收交易。

    一般而言,用戶端會建立交易物件,並使用資源管理員的用戶端介面,將交易物件的 GUID 傳遞至資源管理員。 例如,資源管理員可能會提供 CreateDataObject 例程,類似於 瞭解 TPS 元件 主題所描述的例程。

  7. 參與每個交易。

    ZwOpenTransaction 的呼叫 會開啟一個指向交易物件的控制代碼,然後呼叫 ZwCreateEnlistment 來為交易建立一個註冊條目。 登記可讓資源管理員接收指定的一組 交易通知

  8. 啟用交易通知的接收。

    資源管理員可以呼叫 ZwGetNotificationResourceManager 以同步取得通知,也可以呼叫 TmEnableCallbacks,以註冊 KTM 每當有通知時呼叫的 ResourceManagerNotification 回呼例程。

  9. 處理用戶端的服務資源存取請求,但不會使變更成為永久性。

    用戶端建立交易對象之後,通常會呼叫資源管理員的介面來存取資源管理員的資源。 例如,資料庫的資源管理員可能會接收讀取和寫入資料庫的要求。

    資源管理員必須在 CLFS 記錄流 或其他日誌功能中記錄讀取和寫入操作的結果,直到收到通知,指出交易的操作將被提交、回滾或恢復。

  10. 認可或回復客戶端作業。

    最後,資源管理員會收到通知,開始認可或回復用戶端已執行的作業。 作為回應,資源管理員必須將用戶端作業固定或捨棄它們。 如需如何處理認可和回復通知的詳細資訊,請參閱 處理交易作業

    有時候,資源管理員可能必須嘗試強制 KTM 快速提供認可或回復通知,可能是因為資源管理員已判斷裝置遭到意外移除。 在這種情況下,資源管理員可以呼叫 TmRequestOutcomeEnlistment

  11. 關閉註冊物件句柄。

    在資源管理員完成交易處理之後,該管理員必須呼叫 ZwClose 關閉註冊物件的控制代碼

  12. 關閉 Resource Manager 物件句柄和交易管理員物件句柄。

    在資源管理員卸除之前,它必須呼叫 ZwClose 關閉資源管理員物件的控制代碼和交易管理員物件的控制代碼。

步驟 1 到 5 必須在資源管理員的初始化程式代碼中執行。 例如,如果您的資源管理員是內核模式驅動程式,初始化程式代碼就是驅動程式的 DriverEntry 例程。

步驟 6 到 11 通常是在回應交易式用戶端要求的程式代碼中執行。

步驟 12 必須在資源管理員的最終清除程式代碼中執行,例如內核模式驅動程式的 Unload 例程。

建立 Read-Only 登記

只讀登記 是未從 KTM 接收任何通知的登記。 資源管理員可以呼叫 ZwReadOnlyEnlistment,讓任何登記成為唯讀的。 此呼叫會導致 KTM 停止將通知傳遞至資源管理員。

資源管理員在呼叫 ZwCreateEnlistment之後,可以隨時呼叫 ZwReadOnlyEnlistment,直到它準備通常會呼叫 ZwPrepareComplete的時候為止。

您可能想要資源管理員呼叫 ZwReadOnlyEnlistment的原因有兩個。

  • 您的資源管理員已經參與交易,而且,在收到TRANSACTION_NOTIFY_COMMIT通知之前,資源管理員會判斷它不再需要參與交易的認可作業。

    例如,當資源管理員收到 TRANSACTION_NOTIFY_PREPARE 通知時,它可能會判斷沒有任何交易的操作改變資源管理員的資料庫。 資源管理員可以呼叫 ZwReadOnlyEnlistment,而不是 ZwPrepareComplete,將自身從交易中移除。

  • 您的資源管理員永遠不會參與任何交易的認可作業。

    例如,您的資源管理員可能會監視用戶端傳送的數據,而不需修改任何預存資料庫。 在此情況下,您的資源管理員可能會在呼叫 ZwCreateEnlistment ZwCreateEnlistment 之後立即呼叫 ZwReadOnlyEnlistment。 如本主題的下一節所述,此外,您可以選擇讓這類資源管理員 為易變的

在資源管理員呼叫 ZwReadOnlyEnlistment之後,它可以呼叫 ZwClose 以關閉登記控制代碼。

建立 Volatile-Resource 管理員

非持久性資源管理器 是一種不會維護持久資料的資源管理器。 例如,如果資源管理員未修改永久儲存的資料庫,您可以建立 volatile-resource Manager 來監視用戶端所傳送的數據。 易失性資源管理員通常不會記錄事務活動,因此無法執行復原或回滾操作。

volatile-resource manager 在呼叫 ZwCreateResourceManager時,必須設定RESOURCE_MANAGER_VOLATILE旗標。 如果設定此旗標,KTM 不會在相關聯交易管理員對象的記錄數據流中記錄資源管理員的任何資訊。

當資源管理員呼叫 ZwCreateTransactionManager 時,您也可以設定TRANSACTION_MANAGER_VOLATILE旗標。 如果設定此旗標,KTM 不會建立交易管理員對象的記錄數據流。 此外,連接到交易管理員物件的任何其他資源管理員也必須是動態的,並設定RESOURCE_MANAGER_VOLATILE旗標。

將資源管理器添加至現有的 TPS

如果您必須將額外的資源管理員新增至現有的 TPS,您有兩個選項:

  • 新的資源管理員會呼叫 ZwCreateTransactionManager,以建立自己的交易管理員物件。

    如果您的資源管理員未與 TPS 中的其他資源管理員通訊,請使用此選項。

  • 您的新資源管理員會呼叫 ZwOpenTransactionManager,以聯機到現有的交易管理員物件。

    如果您的資源管理員必須與 TPS 中的其他資源管理員通訊,請使用此選項。 呼叫 ZwCreateTransactionManager 的資源管理員 必須共用交易管理員物件的 GUID、記錄數據流名稱或物件名稱,讓其他資源管理員可以呼叫 ZwOpenTransactionManager。 這些其他資源管理員可以呼叫 ZwQueryInformationTransactionManager,以取得交易管理員物件的其他資訊。

將資源管理員新增至 TPS 之後,了解資源管理員的客戶端可以呼叫資源管理員的客戶端介面。