使用虛擬時鐘值
KTM 會為每個交易管理員物件提供虛擬時鐘。 當資源管理員呼叫 ZwCreateTransactionManager時,KTM 會將物件的虛擬時鐘值設定為 1。 KTM 會在每次開始提交操作時增加虛擬時鐘的數值。 每當 KTM 寫入其記錄數據流時,它就會在記錄檔記錄中包含目前的虛擬時鐘值。
當資源管理員呼叫 ZwRecoverTransactionManager時,KTM 會讀取到數據流結尾的記錄數據流記錄,並將交易管理員對象的虛擬時鐘值設定為它在對象記錄數據流中找到的最後一個值。
當資源管理員呼叫 ZwRollforwardTransactionManager時,KTM 會讀取記錄數據流記錄到指定的時鐘值,並將交易管理員對象的虛擬時鐘值設定為指定的時鐘值。
KTM 可讓資源管理員和上級交易管理員修改交易管理員對象的虛擬時鐘值,但通常不需要修改時鐘值。
修改虛擬時鐘值的時機
一般而言,除非 TPS 中的元件嘗試同步處理多個記錄數據流,否則您的事務處理系統 (TPS) 不需要修改虛擬時鐘值。
例如,假設您的 TPS 包含多個資源管理員,這些資源管理員會在預先準備/準備/認可順序期間彼此通訊。 此外,假設每個資源管理員都會建立具有唯一記錄數據流的交易管理員物件。 為了確保 KTM 在復原作業期間將所有資源管理員的狀態還原到相同的時間點,這些資源管理員可能會使用下列步驟:
當某個資源管理員與另一個資源管理員通訊時,它會傳遞它從 KTM 或其他資源管理員接收的最新虛擬時鐘值。
每當資源管理員呼叫接受虛擬時鐘值的 KTM 例程時(請參閱本主題中的下一節),就會傳遞它從 KTM 或其他資源管理員收到的最高時鐘值。
每個資源管理員都會將虛擬時鐘值寫入其記錄數據流,並在執行回滾或復原操作時使用這些值。
這些步驟會導致 KTM 針對每個交易管理員物件儲存的虛擬時鐘值幾乎或完全相符。 因此,當復原作業導致 KTM 讀取其記錄數據流,或當復原作業導致資源管理員讀取其記錄數據流時,復原或復原會以同步的記錄數據流為基礎。
如何修改虛擬時鐘值
資源管理員可以將新的值傳遞至 ZwPrePrepareComplete、ZwPrepareComplete、ZwCommitComplete、ZwRollbackComplete、ZwReadOnlyEnlistment或 ZwSinglePhaseReject。
進階交易管理員 可以將新值傳遞至 ZwPrepareEnlistment 、ZwPrepareEnlistment、ZwCommitEnlistment或 ZwReadOnlyEnlistment來修改虛擬時鐘值。
此外,使用 ResourceManagerNotification 回呼例程的資源管理員或上級交易管理員可以修改回呼例程收到的虛擬時鐘值。 KTM 接著會儲存更新的值。
如果資源管理員或上級交易管理員將新的時鐘值傳遞給 KTM,則 KTM 只有在大於目前的時鐘值時,才會儲存新的值。 否則,KTM 會保留目前的時鐘值。
資源管理員和上層交易管理員可以藉由呼叫 ZwQueryInformationTransactionManager例程來取得交易管理員對象的虛擬時鐘值。