處理復原作業
在 復原 作業中,交易處理系統 (TPS) 會嘗試從 記錄資料流程中的資訊復原其狀態。 復原作業完成後,所有交易都應該處於已認可或回復狀態,而且所有資源資料都應該處於已知的良好狀態。
有時候 TPS 會在所有交易完成之前停止。 例如,作業系統可能會當機。 因此,每當資源管理員開始執行時,都必須起始復原作業。 復原作業會嘗試判斷是否有任何交易不完整。 如果在記錄檔中找到不完整的交易,復原作業會嘗試認可或回復這些交易。
針對 KTM 型 TPS,每個復原作業都包含兩個步驟。 第一個步驟涉及從交易管理員物件的記錄資料流程復原資訊。 第二個步驟涉及從資源管理員的記錄資料流程復原資訊。
TPS 可以復原到所有記錄資料流程的結尾,或者,如果其資源管理員維護 虛擬時鐘值,它最多可以復原到指定的時鐘值。
從交易管理員物件的記錄資料流程復原資訊
在資源管理員呼叫 ZwCreateTransactionManager 或 ZwOpenTransactionManager之後,它必須呼叫 ZwRecoverTransactionManager。 ZwRecoverTransactionManager常式會讀取屬於交易管理員物件的記錄資料流程。 此常式會重新建構交易管理員物件的狀態, (包括所有交易、登記和資源管理員,) 來自記錄資料流程中復原資訊的復原資訊,從 KTM 建立的最後一個 重新開機區域 開始,並結束于資料流程的結尾。
若要從最後一個重新開機區域復原到指定的虛擬時鐘值,資源管理員可以呼叫 ZwRollforwardTransactionManager ,而不是 ZwRecoverTransactionManager。
從Resource Manager的記錄資料流程復原資訊
在資源管理員呼叫ZwCreateResourceManager或ZwOpenResourceManager 之後,它必須呼叫 ZwRecoverResourceManager。 ZwRecoverResourceManager常式會嘗試復原與每個資源管理員登記相關聯的交易。
當資源管理員呼叫 ZwRecoverResourceManager時,KTM 會針對每個資源管理員的登記傳送TRANSACTION_NOTIFY_RECOVER 通知 。 資源管理員每次收到其中一個TRANSACTION_NOTIFY_RECOVER通知時,都必須呼叫 ZwRecoverEnlistment 。
當資源管理員呼叫 ZwRecoverEnlistment時,KTM 會傳送下列其中一個通知:
TRANSACTION_NOTIFY_COMMIT
資源管理員必須使用記錄資料流程中的資訊來認可交易,然後必須呼叫 ZwCommitComplete。
TRANSACTION_NOTIFY_ROLLBACK
資源管理員必須使用其記錄資料流程中的資訊來復原交易,然後必須呼叫 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通知。