瞭解 TPS 元件

任何使用核心交易管理員 (KTM) 和一般記錄檔案系統 (CLFS) 的事務處理系統 (TPS) 都應該包含下列重要元件:

  • KTM (交易管理員)

    KTM 會追蹤每個交易的狀態,並在系統當機之後協調復原作業。

  • 一或多個 資源管理員

    您提供的資源管理員會管理與每個交易相關聯的資料。

  • 一或多個 CLFS 記錄資料流程

    交易管理員和資源管理員會使用 CLFS 記錄資料流程來記錄可用來認可、復原或復原交易的資訊。

  • 一或多個 交易式用戶端

    一般而言,TPS 的每個交易用戶端都可以建立交易、對交易內容中的資料執行作業,然後起始交易的認可或復原作業。

本主題將介紹簡單的 TPS ,其中包含一個資源管理員、包含 多個資源管理員的較複雜 TPS,以及其他一些 TPS 案例

使用 KTM一節提供有關如何使用 KTM 建立 TPS 元件的詳細資訊。

簡單 TPS

簡單的 TPS 可能包含 KTM、一個資源管理員和 CLFS。 交易式用戶端可以透過資源管理員提供的介面來與資源管理員通訊。

例如,假設您想要建立資料庫管理系統。 您想要讓系統的用戶端開啟資料庫物件的控制碼、對物件執行讀取和寫入作業,然後關閉物件控制碼,以存取資料庫。

現在假設您想要以不可部分完成的方式執行讀取和寫入作業集合,讓系統的其他使用者只看到最終的結果。 您可以藉由設計 TPS 來達成該目標,讓用戶端將資料庫作業集系結至交易。

您的系統應該包含資源管理員,以管理資料庫中的資料,以回應用戶端的讀取和寫入要求。 此資源管理員可以將應用程式開發介面匯出 (API) ,讓用戶端能夠將交易與一組讀取和寫入作業產生關聯。

載入資源管理員時,它必須藉由呼叫 ZwCreateTransactionManagerZwCreateResourceManager向 KTM 註冊本身。 然後,資源管理員可以參與交易。

您可能想要讓資源管理員支援一組函式,讓用戶端能夠建立資料物件、讀取和寫入與資料物件相關聯的資料,以及關閉資料物件。 下列虛擬程式碼顯示來自用戶端的範例程式碼序列。

CreateDataObject (IN TransactionID, OUT DataHandle);
ReadData (IN DataHandle, OUT Data);
WriteData (IN DataHandle, IN Data);
WriteData (IN DataHandle, IN Data);
WriteData (IN DataHandle, IN Data);
CloseDataObject (IN DataHandle);

用戶端必須先呼叫 KTM 的ZwCreateTransaction常式來建立交易對象,並藉由呼叫ZwQueryInformationTransaction來取得交易對象的識別碼,用戶端才能呼叫 Resource Manager 的CreateDataObject常式。

當用戶端呼叫 Resource Manager 的 CreateDataObject 常式時,用戶端會將交易對象的識別碼傳遞給資源管理員。 資源管理員可以呼叫 ZwOpenTransaction 來取得交易對象的控制碼,然後呼叫 ZwCreateEnlistment 來註冊其參與交易。

此時,用戶端可以開始對資料物件執行作業。 由於用戶端在建立資料物件時提供了交易識別碼,因此資源管理員可以將所有讀取和寫入作業指派給交易。

您的資源管理員必須記錄用戶端所指定之資料作業的所有結果,而不會永久產生結果。 一般而言,資源管理員會使用 CLFS 來記錄交易記錄資料流程中的作業結果。

當用戶端完成呼叫資源管理員以執行交易式作業時,它會呼叫 KTM 的 ZwCommitTransaction 常式。 此時,KTM 會通知 資源管理員應該讓作業永久完成。 資源管理員接著會將作業結果從記錄資料流程移至資料的永久儲存媒體。 最後,資源管理員會呼叫 ZwCommitComplete ,通知 KTM 認可作業已完成。

如果您的資源管理員回報其中一個用戶端對 ReadDataWriteData的呼叫發生錯誤,會發生什麼事? 用戶端可以呼叫 ZwRollbackTransaction 來回複交易。 由於該呼叫,KTM 會通知資源管理員應該將資料還原至其原始狀態。 然後,用戶端可以針對相同的作業建立新的交易,也可以選擇不繼續。

下列虛擬程式碼顯示更詳細的用戶端交易作業序列範例。

    ZwCreateTransaction (&TransactionHandle, ...);
    ZwQueryInformationTransaction (TransactionHandle, ...);
    CreateDataObject (TransactionID, &DataHandle);
    Status = ReadData (DataHandle, &Data1);
    if (Status == Error) goto ErrorRollback;
    Status = WriteData (DataHandle, Data2);
    if (Status == Error) goto ErrorRollback;
    Status = WriteData (DataHandle, Data3);
    if (Status == Error) goto ErrorRollback;
    Status = WriteData (DataHandle, Data4);
    if (Status == Error) goto ErrorRollback;
    ZwCommitTransaction (TransactionHandle, ...);
    goto Leave;
ErrorRollback:
    ZwRollbackTransaction (TransactionHandle, ...);
Leave:
    ZwClose (TransactionHandle);
    return;

如果系統在建立交易之後,但在認可或回復之前當機,會發生什麼事? 每次資源管理員載入時,都應該呼叫 ZwRecoverTransactionManagerZwRecoverResourceManager。 呼叫 ZwRecoverTransactionManager 會導致 KTM 開啟其記錄資料流程,並讀取交易歷程記錄。 呼叫 ZwRecoverResourceManager 會讓 KTM 通知資源管理員任何在損毀之前進行中的登記交易,以及資源管理員必須復原哪些交易。

如果交易在當機前呼叫 ZwCommitTransaction 的交易用戶端,並開始處理交易的認可作業,則資源管理員必須能夠將交易的狀態還原到當機前的點。 如果用戶端尚未準備好在當機前認可交易,資源管理員可以捨棄資料並復原交易。

如需如何撰寫交易式用戶端的詳細資訊,請參閱 建立交易式用戶端

如需如何撰寫資源管理員的詳細資訊,請參閱建立Resource Manager

TPS 中的多個資源管理員

現在假設您的 TPS 可讓用戶端在單一交易內修改兩個不同的資料庫中的資訊,因此只有在兩個資料庫的修改成功時,交易才會成功。

在此情況下,您的 TPS 可以有兩個資源管理員,每個資料庫各有一個。 每個資源管理員都可以匯出用戶端可用來存取資源管理員資料庫的 API。

下列虛擬程式碼示範用戶端如何建立單一交易,其中包含兩個資源管理員支援之兩個資料庫的作業。

在此範例中,用戶端會從第一個資料庫讀取資料,並將它寫入第二個資料庫。 然後,用戶端會從第二個資料庫讀取資料,並將它寫入第一個資料庫。 (第一個資源管理員會匯出以 Rm1開頭的函式,而第二個資源管理員會匯出以 Rm2.) 開頭的函式

    ZwCreateTransaction (&TransactionHandle, ...);
    ZwQueryInformationTransaction (TransactionHandle, ...);
    Rm1CreateDataObject (TransactionID, &Rm1DataHandle);
    Rm2CreateDataObject (TransactionID, &Rm2DataHandle);
    Status = Rm1ReadData (Rm1DataHandle, &Rm1Data);
    if (Status == Error) goto ErrorRollback;
    Status = Rm2WriteData (Rm2DataHandle, Rm1Data);
    if (Status == Error) goto ErrorRollback;
    Status = Rm2ReadData (Rm2DataHandle, &Rm2Data);
    if (Status == Error) goto ErrorRollback;
    Status = Rm1WriteData (Rm1DataHandle, Rm2Data);
    if (Status == Error) goto ErrorRollback;
    ZwCommitTransaction (TransactionHandle, ...);
    goto Leave;
ErrorRollback:
    ZwRollbackTransaction (TransactionHandle, ...);
Leave:
    ZwClose (TransactionHandle);
    return;

由於用戶端會將相同的交易識別碼傳遞給這兩個資源管理員,因此兩個資源管理員都可以呼叫 ZwOpenTransactionZwCreateEnlistment ,以在交易中登記。 當用戶端最後呼叫 ZwCommitTransaction時,KTM 會通知 每個資源管理員應該永久執行作業,而每個資源管理員在作業完成時都會呼叫 ZwCommitComplete

其他 TPS 案例

KTM 支援其他 TPS 案例。 例如,下列案例描述 TPS 可能包含的元件:

  • 一個管理多個資料庫的資源管理員。

    資源管理員的 API 可讓用戶端一次開啟和存取多個資料庫,而用戶端可以在單一交易中結合對多個資料庫的存取。

  • 一個具有用戶端呼叫之 API 的資源管理員,以及具有第一個資源管理員呼叫之 API 的其他資源管理員。

    用戶端只會與第一個資源管理員通訊。 當該資源管理員處理來自用戶端的要求時,它可以視需要存取其他資源管理員來處理用戶端的要求。 例如,資源管理員會管理用戶端可存取的資料庫,該資料庫需要來自用戶端無法使用的第二個資源管理員進行備份或資料驗證作業。

  • 未使用 KTM 的現有用戶端和資源管理員,與一組使用 KTM 的額外資源管理員整合。

    在此情況下,您通常必須修改現有的資源管理員,讓它成為與 KTM 通訊的 上層交易管理員