復原處理
在任何中斷正常交易處理的失敗類型之後,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,RM 可以藉由呼叫 CommitComplete來完成交易。
如果 RM 收到TRANSACTION_NOTIFY_INDOUBT,RM 應該等候結果通知送達。
對於 RM 未收到TRANSACTION_NOTIFY_RECOVER通知,但先前收到TRANSACTION_NOTIFY_PREPARE通知的任何交易,RM 應該處理交易,就像回復交易一樣。
注意
在執行復原的過程中,允許資源管理員登記或建立新的交易。
KTM 使用 假設的中止 交易模型。 下列案例說明此行為。 假設 KTM 和資源管理員存在於同一部電腦上。 假設 KTM 發出交易的準備通知,但系統在 KTM 記錄準備通知之前損毀。 進一步假設資源管理員會在系統當機之前收到並記錄準備通知。 還原系統之後,KTM 就不知道交易,因為它從未記錄過準備階段。 資源管理員具備交易的知識,因為它已接收、處理和記錄準備通知。 當 KTM 發出其復原通知時,資源管理員不會包含有問題的交易復原通知。 在此案例中,假設中止模型時,資源管理員會將備妥的交易視為中止,因為未收到通知以在該交易上執行復原。