共用方式為


處理復原作業

復原 作業中,事務處理系統 (TPS) 會嘗試從 記錄數據流中的資訊復原其狀態。 復原作業完成之後,所有交易都應該處於認可或回復狀態,而且所有資源數據都應該處於已知的良好狀態。

有時候 TPS 會在所有交易完成之前停止。 例如,作業系統可能會當機。 因此,資源管理員必須在開始執行時起始復原作業。 復原作業會嘗試判斷是否有任何交易不完整。 如果在記錄中找到不完整的交易,復原作業會嘗試認可或回復這些交易。

針對以 KTM 為基礎的 TPS,每個復原作業都包含兩個步驟。 第一個步驟涉及從交易管理員對象的記錄數據流中復原資訊。 第二個步驟涉及從資源管理員的記錄數據流中復原資訊。

TPS 可以復原到所有記錄數據流的結尾,或者,如果其資源管理員維護 虛擬時鐘值,它最多可以復原到指定的時鐘值。

從交易管理員對象的記錄數據流復原資訊

在資源管理員呼叫 ZwCreateTransactionManagerZwOpenTransactionManager 之後,它必須呼叫 ZwRecoverTransactionManagerZwRecoverTransactionManager 例程會讀取屬於交易管理員對象的記錄數據流。 此例程會從記錄數據流中的復原資訊重新建構交易管理員物件的狀態(包括所有交易、登記和資源管理員),從 KTM 建立的最後 一個重新啟動區域 開始,並在數據流結尾結束。

若要從最後一個重新啟動區域復原到指定的虛擬時鐘值,資源管理員可以呼叫 ZwRollforwardTransactionManager ,而不是 ZwRecoverTransactionManager

從資源管理器的日誌流復原資訊

在資源管理員呼叫 ZwCreateResourceManagerZwOpenResourceManager 之後,它必須呼叫 ZwRecoverResourceManagerZwRecoverResourceManager 例程會嘗試復原與每個資源管理員登記相關聯的交易。

當資源管理員呼叫 ZwRecoverResourceManager 時,KTM 會針對每個資源管理員的登記傳送TRANSACTION_NOTIFY_RECOVER 通知 。 每當資源管理員收到 TRANSACTION_NOTIFY_RECOVER 通知時,都必須呼叫 ZwRecoverEnlistment

當資源管理員呼叫 ZwRecoverEnlistment 時,KTM 會傳送下列其中一個通知:

  • 交易通知_提交

    資源管理員必須使用記錄數據流中的資訊來認可交易,然後必須呼叫 ZwCommitComplete

  • 交易通知回滾

    資源管理員必須使用其記錄數據流中的資訊來回復交易,然後必須呼叫 ZwRollbackComplete

  • TRANSACTION_NOTIFY_INDOUBT

    KTM 尚未判斷交易的狀態,且稍後會傳送認可或回復通知。

一般而言,如果 KTM 確定在 TPS 停止並重新啟動之前,所有資源管理員都已呼叫 ZwPrepareComplete,則會傳送 TRANSACTION_NOTIFY_COMMIT 通知。 如果 KTM 判斷一或多個資源管理員未呼叫 ZwPrepareComplete,就會傳送TRANSACTION_NOTIFY_ROLLBACK通知。

在 KTM 為每個登記傳送 TRANSACTION_NOTIFY_RECOVER 通知之後,它會傳送 TRANSACTION_NOTIFY_LAST_RECOVER 通知。

如果您的資源管理員呼叫了ZwRollforwardTransactionManager而不是ZwRecoverTransactionManager ,那麼它必須只復原到它指定給ZwRollforwardTransactionManager的虛擬時鐘值。

資源管理員可以呼叫 ZwSetInformationEnlistment 來設定自定義的復原資訊。 KTM 會儲存這項資訊,並將其寫入記錄數據流,但 KTM 不會嘗試解譯資訊。 資源管理員可以隨時呼叫 ZwQueryInformationEnlistment 來擷取復原資訊。

上層交易管理員 有時會在復原作業期間收到TRANSACTION_NOTIFY_RECOVER_QUERY通知。