處理提交操作
認可作業有兩種類型:單階段認可 和 多階段認可。 單一階段認可作業是由資源管理員必須回應的單一通知所組成,而多階段認可作業則包含準備步驟的其他通知。
單一階段提交操作更容易實施。 它適用於具有下列其中一個特性的事務處理系統(TPS:
單一資源管理員。
多個資源管理員,除了其中一個資源管理員 只讀,也不會參與認可作業。
如果多個資源管理員參與認可作業,則需要多階段認可作業。
Single-Phase 提交操作
如果您希望 TPS 支援單一階段認可作業,則必須有一個(且僅有一個)資源管理員進行註冊,以便接收其登記的 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 通知。 所有其他資源管理器都必須為 唯讀。
包含上層交易管理員 的 TPS 無法使用單一階段認可。
如果資源管理員已註冊接收 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 通知,當交易客戶端呼叫 ZwCommitTransaction 時,KTM 會發送這類通知。
當資源管理員收到交易的TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知時,它可以認可交易或拒絕單一階段認可。
若要認可交易,資源管理員必須執行下列動作:
清除它所儲存的非永久快取(記憶體內部記憶體)中的任何數據,例如 CLFS 封送處理區域CLFS 記錄資料流。
資源管理員必須將數據從快取移至永久性儲存媒體。 例如,使用 CLFS 的資源管理員可以呼叫 clfsFlushBuffers 。
讓所有數據變更永久且公開(也就是在資源管理員範圍外可見)。
呼叫 ZwCommitComplete。
呼叫 ZwCommitComplete之後,資源管理員應該呼叫 ZwClose 來關閉註冊控制代碼。
若要拒絕交易的單階段認可作業,資源管理員可以呼叫 ZwSinglePhaseReject。 如果資源管理員呼叫 ZwSinglePhaseReject,KTM 會立即將提交操作從單一階段變更為多階段。
如果其他資源管理員在相同的交易中登記,則必須 唯讀。 不過,他們必須註冊以接收TRANSACTION_NOTIFY_RM_DISCONNECTED通知。如果處理單一階段認可作業的資源管理員在未表明已成功提交或回復交易的情況下關閉登記控制代碼,他們會收到通知。
多階段認可作業
當發生下列其中一個事件時,就會開始多階段認可作業:
事務型用戶端會呼叫 ZwCommitTransaction,而且沒有資源管理器註冊接收 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 通知。
資源管理員會在收到TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知之後,呼叫 ZwSinglePhaseReject。
多階段認可作業包含三個循序階段:預先準備、準備,以及 認可。
準備前階段
當 KTM 傳送 TRANSACTION_NOTIFY_PREPREPARE 通知給所有資源管理員時,認可操作的預備準備階段(也稱為 階段零)便開始。 如果沒有任何資源管理員支援交易的單階段認可作業,或上層交易管理員呼叫 ZwPrepareEnlistment,KTM 就會傳送此通知。
當每個資源管理員收到TRANSACTION_NOTIFY_PREPREPARE通知時,它必須執行下列動作:
清除它所儲存的非永久快取(記憶體內部記憶體)中的任何數據,例如 CLFS 封送處理區域CLFS 記錄資料流。
資源管理員必須將數據從快取移至永久性儲存媒體。 例如,使用 CLFS 的資源管理員可以呼叫 clfsFlushBuffers 。
在資源管理員呼叫 ZwPreprepareComplete之後,它可以繼續接收和服務用戶端要求。 但資源管理員必須將所有數據修改視為立即寫入長期儲存媒體的快取傳遞作業。
如果資源管理員處理TRANSACTION_NOTIFY_PREPREPARE通知時發生錯誤,則應該呼叫 ZwRollbackEnlistment 來回復交易。
準備階段
當 KTM 傳送 "TRANSACTION_NOTIFY_PREPARE" 通知給所有資源管理員時,提交作業的 準備階段(也稱為第一階段)開始。 如果沒有任何資源管理員支援單一階段認可,或是上層交易管理員呼叫 ZwPrepareEnlistment,KTM會在 TRANSACTION_NOTIFY_PREPREPARE 之後傳送此通知。
當每個資源管理員收到TRANSACTION_NOTIFY_PREPARE通知時,它必須執行下列動作:
停止維護用戶端要求,並將任何用戶端後續要求回報為客戶端錯誤。
請確定所有數據都已移至永久性記憶體。
如果資源管理員在處理TRANSACTION_NOTIFY_PREPARE通知時發生錯誤,則應該呼叫 ZwRollbackEnlistment 來回復交易。 不過,資源管理員在呼叫 ZwPrepareComplete之後,就無法回復交易。
提交階段
當 KTM 傳送 TRANSACTION_NOTIFY_COMMIT 通知給所有資源管理員時,提交操作的提交階段(也稱為 階段二)開始。 KTM會在TRANSACTION_NOTIFY_PREPARE之後傳送此通知,如果沒有任何資源管理員支援單一階段認可,或上層交易管理員呼叫 ZwCommitEnlistment。
當每個資源管理員收到TRANSACTION_NOTIFY_COMMIT通知時,它必須執行下列動作:
使所有數據變更永久生效並公開(即其他交易可供查看)。
一般而言,資源管理員會藉由將交易的已儲存數據從記錄數據流複製到資料庫的公用永久記憶體,以永久變更和公用。 有關如何使用記錄數據流的更多資訊,請參閱 使用記錄數據流搭配 KTM。
呼叫 ZwCommitComplete。
在資源管理員呼叫 ZwCommitComplete之後,應該再呼叫 ZwClose 以關閉登錄句柄。
如果資源管理員在處理TRANSACTION_NOTIFY_COMMIT通知時發生錯誤,它應該會自行關閉。 下次作系統重載資源管理員時,資源管理員的 復原程式 應該將交易還原到錯誤發生前已知良好狀態。