建立Resource Manager
資源管理員 會維護每個交易的資料,並記錄交易的作業。 如果交易處理系統 (TPS) 有多個資源管理員,則每個資源管理員都可以參與每個交易的認可、復原和復原作業。
每個資源管理員都必須匯出交易式用戶端可用來存取資源管理員所維護之資料庫或其他資源的介面。
一般而言,核心模式資源管理員必須依列出的循序執行下列工作:
建立記錄資料流程。
資源管理員可以使用 Common Log File System (CLFS) 或其他記錄功能來維護其記錄資料流程。 呼叫 ClfsCreateLogFile 會 建立 CLFS 記錄資料流程。 資源管理員必須使用記錄資料流程來記錄認可、復原或復原交易所需的任何資訊。 此外,KTM 會使用記錄資料流程來記錄任何可能需要復原交易的內部狀態變更。
建立交易管理員物件。
呼叫 ZwCreateTransactionManager 會 建立交易管理員物件,並將資源管理員連接到資源管理員指定的其他 CLFS 記錄資料流程。
復原交易管理員狀態。
呼叫 ZwRecoverTransactionManager 會讀取交易管理員物件的記錄資料流程, (KTM 維護) ,並判斷 TPS 是否在完成所有交易之前關閉 (,例如,因為系統) 損毀。 KTM 會根據記錄資料流程中的資訊還原其內部狀態。
建立 Resource Manager 物件。
呼叫 ZwCreateResourceManager 會 建立資源管理員物件,並將它與先前建立的交易管理員物件產生關聯。
復原資源管理員狀態。
呼叫 ZwRecoverResourceManager 會導致 KTM 針對資源管理員上次關閉時進行的任何交易傳送資源管理員TRANSACTION_NOTIFY_RECOVER通知。 如需資源管理員如何回應這些通知的資訊,請參閱 處理復原作業。
從用戶端接收交易。
一般而言,用戶端會建立交易對象,並使用資源管理員的用戶端介面將交易對象的 GUID 傳遞至資源管理員。 例如,資源管理員可能會提供 CreateDataObject 常式,類似于 瞭解 TPS 元件 主題所描述的常式。
在每個交易中登記。
呼叫 ZwOpenTransaction 會開啟交易對象的控制碼,然後呼叫 ZwCreateEnlistment 會建立交易的登記。 登記可讓資源管理員接收一組指定的 交易通知。
啟用交易通知的接收。
資源管理員可以呼叫 ZwGetNotificationResourceManager 以同步取得通知,也可以呼叫 TmEnableCallbacks 來註冊 KTM 在有通知可用時呼叫 的 ResourceManagerNotification 回呼常式。
服務資源從用戶端存取要求,但不會永久變更。
用戶端建立交易對象之後,通常會呼叫資源管理員的 介面來存取資源管理員的資源。 例如,資料庫的資源管理員可能會收到讀取和寫入資料庫的要求。
資源管理員必須在 CLFS 記錄資料流程 或其他記錄功能中記錄讀取和寫入作業的結果,直到收到交易作業將認可、回復或復原的通知為止。
認可或復原用戶端作業。
最後,資源管理員會收到通知,以開始認可或復原用戶端已執行的作業。 為了回應,資源管理員必須將用戶端作業設為永久或捨棄它們。 如需如何處理認可和回復通知的詳細資訊,請參閱 處理交易作業。
有時候,資源管理員可能必須嘗試強制 KTM 快速提供認可或復原通知,可能是因為資源管理員判定裝置遭到意外移除。 在這種情況下,資源管理員可以呼叫 TmRequestOutcomeEnlistment。
關閉登錄物件控制碼。
在資源管理員完成交易處理之後,它必須呼叫 ZwClose 以關閉登錄物件的控制碼
關閉 Resource Manager 物件控制碼和交易管理員物件控制碼。
在資源管理員卸載之前,它必須呼叫 ZwClose 以關閉 Resource Manager 物件的控制碼和交易管理員物件的控制碼。
步驟 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之後立即呼叫ZwReadOnlyEnlistment。 此外,您可以選擇讓這類資源管理員 變成變動性,如本主題的下一節所述。
在資源管理員呼叫 ZwReadOnlyEnlistment之後,它可以呼叫 ZwClose 以關閉登記控制碼。
建立Volatile-Resource管理員
volatile-resource manager是不會維護長期資料的資源管理員。 例如,如果資源管理員未修改永久儲存的資料庫,您可以建立 volatile-resource Manager 來監視用戶端傳送的資料。 變動性資源管理員通常不會記錄事務活動,因此無法執行復原或復原作業。
volatile-resource Manager 在呼叫 ZwCreateResourceManager時,必須設定RESOURCE_MANAGER_VOLATILE旗標。 如果設定此旗標,KTM 不會在相關聯交易管理員物件的記錄資料流程中記錄有關資源管理員的任何資訊。
當您的資源管理員呼叫 ZwCreateTransactionManager時,也可以設定TRANSACTION_MANAGER_VOLATILE旗標。 如果設定此旗標,KTM 不會為交易管理員物件建立記錄資料流程。 此外,連接到交易管理員物件的任何其他資源管理員也必須是變動性,並設定RESOURCE_MANAGER_VOLATILE旗標。
將Resource Manager新增至現有的 TPS
如果您必須將額外的資源管理員新增至現有的 TPS,您有兩個選項:
您的新資源管理員會呼叫 ZwCreateTransactionManager 來建立自己的交易管理員物件。
如果您的資源管理員未與 TPS 中的其他資源管理員通訊,請使用此選項。
您的新資源管理員會呼叫 ZwOpenTransactionManager 來連線到現有的交易管理員物件。
如果您的資源管理員必須與 TPS 中的其他資源管理員通訊,請使用此選項。 呼叫 ZwCreateTransactionManager 的資源管理員必須共用交易管理員物件的 GUID、記錄資料流程名稱或物件名稱,讓其他資源管理員可以呼叫 ZwOpenTransactionManager。 這些其他資源管理員可以呼叫 ZwQueryInformationTransactionManager ,以取得交易管理員物件的其他資訊。
將資源管理員新增至 TPS 之後,知道資源管理員的用戶端可以呼叫資源管理員的用戶端介面。