處理認可作業

認可作業有兩種類型: 單階段認可多階段認可。 單階段認可作業是由資源管理員必須回應的單一通知所組成,而多階段認可作業則包含準備步驟的其他通知。

單階段認可作業比較容易實作。 它適用于具有下列其中一個特性的交易處理系統 (TPSs) :

  • 單一資源管理員。

  • 多個資源管理員,但其中一個是 唯讀 的,而且不會參與認可作業。

如果多個資源管理員參與認可作業,則需要多階段認可作業。

Single-Phase認可作業

如果您想要讓 TPS 支援單階段認可作業,一個 (,而且只有一個) 資源管理員必須註冊才能接收其登記的TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 通知 。 所有其他資源管理員都必須 是唯讀的

包含 上層交易管理員 的 TPS 無法使用單階段認可。

如果資源管理員已註冊接收TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知,KTM 會在交易式用戶端呼叫 ZwCommitTransaction時傳送這類通知。

當資源管理員收到交易的TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知時,它可以認可交易或拒絕單階段認可。

若要認可交易,資源管理員必須執行下列動作:

  1. 排清它保留于非永久快取中的任何資料, (記憶體內部儲存體) ,例如CLFS 記錄資料流程CLFS 封送處理區域

    資源管理員必須將資料從快取移至長期儲存媒體。 例如,使用 CLFS 的資源管理員可以呼叫 ClfsFlushBuffers

  2. 讓所有資料變更變成永久和公用 (,也就是在資源管理員的範圍) 外可見。

  3. 呼叫 ZwCommitComplete

呼叫 ZwCommitComplete之後,資源管理員應該呼叫 ZwClose 以關閉登記控制碼。

若要拒絕交易的單階段認可作業,資源管理員可以呼叫 ZwSinglePhaseReject。 如果資源管理員呼叫 ZwSinglePhaseReject,KTM 會立即將認可作業從單階段變更為多階段。

如果其他資源管理員登記在相同的交易中,則必須 是唯讀的。 不過,他們必須註冊才能接收TRANSACTION_NOTIFY_RM_DISCONNECTED通知,如果處理單一階段認可作業的資源管理員關閉登記控制碼,而不表示它已認可或回復交易,則會收到通知。

多階段認可作業

當發生下列其中一個事件時,就會開始多階段認可作業:

多階段認可作業包含三個循序階段: 預先準備準備認可

準備前階段

當 KTM 傳送TRANSACTION_NOTIFY_PREPREPARE通知給所有資源管理員時,預先準備階段 (也稱為認可作業的 階段零) 開始。 如果沒有任何資源管理員支援交易的單階段認可作業,或是上層交易管理員呼叫 ZwPrepareEnlistment,則 KTM 會傳送此通知。

當每個資源管理員收到TRANSACTION_NOTIFY_PREPREPARE通知時,它必須執行下列動作:

  1. 排清它保留于非永久快取中的任何資料, (記憶體內部儲存體) ,例如CLFS 記錄資料流程CLFS 封送處理區域

    資源管理員必須將資料從快取移至長期儲存媒體。 例如,使用 CLFS 的資源管理員可以呼叫 ClfsFlushBuffers

  2. 呼叫 ZwPrepareComplete

資源管理員呼叫 ZwPrepareComplete之後,就可以繼續接收和服務用戶端要求。 但資源管理員必須將所有資料修改視為立即寫入長期儲存媒體的快取傳遞作業。

如果資源管理員在處理TRANSACTION_NOTIFY_PREPREPARE通知時遇到錯誤,它應該呼叫 ZwRollbackEnlistment 來回複交易。

準備階段

當 KTM 將TRANSACTION_NOTIFY_PREPARE通知傳送給所有資源管理員時,準備階段 (也稱為認可作業的第 一階段) 開始。 KTM 會在TRANSACTION_NOTIFY_PREPREPARE之後傳送此通知,如果沒有資源管理員支援單一階段認可,或如果上層交易管理員呼叫 ZwPrepareEnlistment

當每個資源管理員收到TRANSACTION_NOTIFY_PREPARE通知時,它必須執行下列動作:

  1. 停止維護用戶端要求,並將任何用戶端後續要求回報為用戶端錯誤。

  2. 請確定所有資料都已移至永久性儲存體。

  3. 呼叫 ZwPrepareComplete

如果資源管理員在處理TRANSACTION_NOTIFY_PREPARE通知時發生錯誤,它應該呼叫 ZwRollbackEnlistment 來復原交易。 不過,資源管理員在呼叫 ZwPrepareComplete之後無法回復交易。

認可階段

當 KTM 傳送TRANSACTION_NOTIFY_COMMIT通知給所有資源管理員時,認可階段 (也稱為認可作業 的第二階段) 開始。 KTM 會在TRANSACTION_NOTIFY_PREPARE之後傳送此通知,如果沒有資源管理員支援單一階段認可,或是上層交易管理員呼叫 ZwCommitEnlistment

當每個資源管理員收到TRANSACTION_NOTIFY_COMMIT通知時,它必須執行下列動作:

  1. 對其他交易) 可見的永久和公用 (進行所有資料變更。

    一般而言,資源管理員會藉由將交易的儲存資料從記錄資料流程複製到資料庫的公用、永久儲存體,以永久變更。 如需如何使用記錄資料流程的詳細資訊,請參閱 搭配 KTM 使用記錄資料流程

  2. 呼叫 ZwCommitComplete

資源管理員呼叫 ZwCommitComplete之後,應該呼叫 ZwClose 以關閉登記控制碼。

如果資源管理員在處理TRANSACTION_NOTIFY_COMMIT通知時發生錯誤,它應該會自行關閉。 下次作業系統重載資源管理員時,資源管理員的 復原程式 應該將交易還原到已知在錯誤發生前良好的狀態。