在中斷正常事務處理的任何類型的失敗之後,KTM 和每個資源管理員都必須執行 復原 作業。 復原是指交易參與者達成每個交易狀態一致性觀點的過程。
資源管理員可能會 懷疑交易的結果,這表示在失敗時,他們已收到TRANSACTION_NOTIFY_PREPARE通知,已準備長期儲存,但尚未收到(或未記錄)交易的最終結果。 同樣地,如果交易已備妥但尚未收到結果(或已收到但未記錄結果),則 KTM 可能會對交易的狀態感到懷疑。 在復原時間,所有已傳送但尚未確認的結果都必須重新傳送。 例如,如果資源管理員收到TRANSACTION_NOTIFY_COMMIT通知,並呼叫 CommitComplete 函式,RM 仍可能會在復原時收到重複的TRANSACTION_NOTIFY_COMMIT通知。
若要讓交易在資源管理員或系統失敗後正確復原,每個資源管理員必須在每次啟動時執行下列動作:
呼叫 OpenResourceManager 函式,以使用其唯一的持續性名稱重新開啟其資源管理員句柄。 這會通知 KTM,指示資源管理員已再次啟動並可執行復原作業。 如果沒有要復原的登記,OpenResourceManager 呼叫可能會失敗。 呼叫 CreateResourceManager 以重新建立 RM 物件。
呼叫 RecoverResourceManager。 資源管理員將會為每個需要執行復原作業的登錄接收一個 TRANSACTION_NOTIFY_RECOVER 通知事件,然後會接收到TRANSACTION_NOTIFY_LAST_RECOVER。 通知事件包含交易和登記的全域唯一標識符。
呼叫 OpenEnlistment 函式,以重新開啟資源管理員收到 TRANSACTION_NOTIFY_RECOVER 通知的每個登錄控制代碼。
針對由 OpenEnlistment開啟的每個註冊,呼叫 RecoverEnlistment。 這會導致重新傳遞TRANSACTION_NOTIFY_COMMIT或TRANSACTION_NOTIFY_INDOUBT通知。
如果 RM 收到 TRANSACTION_NOTIFY_COMMIT,可以藉由呼叫 CommitComplete來完成交易。
如果 RM 收到 "TRANSACTION_NOTIFY_INDOUBT",RM 應該等候結果通知送達。
對於 RM 沒有收到TRANSACTION_NOTIFY_RECOVER通知,但之前收到過TRANSACTION_NOTIFY_PREPARE通知的任何交易,RM 應該將交易視為已經回滾並進行處理。
注意
在執行復原的過程中,允許資源管理員登記或建立新的交易。
KTM 會使用 預設中止 交易模型。 下列案例說明此行為。 假設 KTM 和資源管理員存在於同一部電腦上。 假設 KTM 發出交易的準備通知,但系統在 KTM 記錄準備通知之前損毀。 進一步假設資源管理員在系統當機前收到並記錄準備通知。 還原系統之後,KTM 就不知道交易,因為它從未記錄過準備階段。 資源管理員知道交易,因為它已接收、處理及記錄準備通知。 當 KTM 發出其復原通知時,資源管理員不包括所涉及的交易的復原通知。 使用假設中止模型時,此案例中的資源管理員會將備妥的交易視為中止,因為該交易未收到通知以在該交易上執行復原。