使用虛擬時鐘值

KTM 為每個交易管理員物件提供虛擬時鐘。 當資源管理員呼叫 ZwCreateTransactionManager時,KTM 會將物件的虛擬時鐘值設定為 1。 KTM 會在每次開始認可作業時遞增虛擬時鐘值。 每當 KTM 寫入其記錄資料流程時,就會在記錄檔記錄中包含目前的虛擬時鐘值。

當資源管理員呼叫 ZwRecoverTransactionManager時,KTM 會讀取到資料流程結尾的記錄資料流程記錄,並將交易管理員物件的虛擬時鐘值設定為它在物件記錄資料流程中找到的最後一個值。

當資源管理員呼叫 ZwRollforwardTransactionManager時,KTM 會讀取最多指定時鐘值的記錄資料流程記錄,並將交易管理員物件的虛擬時鐘值設定為指定的時鐘值。

KTM 可讓資源管理員和上層交易管理員修改交易管理員物件的虛擬時鐘值,但通常不需要修改時鐘值。

何時修改虛擬時鐘值

一般而言,除非 TPS 中的元件嘗試同步處理多個記錄資料流程,否則您的交易處理系統 (TPS) 不需要修改虛擬時鐘值。

例如,假設您的 TPS 包含多個在預先準備/準備/認可順序期間彼此通訊的資源管理員。 此外,假設每個資源管理員都會建立具有唯一記錄資料流程的交易管理員物件。 為了確保 KTM 會將所有資源管理員的狀態還原到復原作業期間相同的時間點,這些資源管理員可能會使用下列步驟:

  • 當某個資源管理員與另一個資源管理員通訊時,它會傳遞它從 KTM 或另一個資源管理員收到的最近虛擬時鐘值。

  • 每當資源管理員呼叫接受虛擬時鐘值的 KTM 常式時, (請參閱本主題中的下一節) ,它會傳遞從 KTM 或其他資源管理員收到的最高時鐘值。

  • 每個資源管理員都會將虛擬時鐘值寫入其記錄資料流程,並在執行復原或復原作業時使用這些值。

這些步驟會導致 KTM 針對每個交易管理員物件儲存的虛擬時鐘值幾乎或完全相符。 因此,當復原作業造成 KTM 讀取其記錄資料流程,或復原作業導致資源管理員讀取其記錄資料流程時,復原或復原是以同步處理的記錄資料流程為基礎。

如何修改虛擬時鐘值

資源管理員可以將新值傳遞至ZwPrepareCompleteZwPrepareComplete、ZwCommitCompleteZwRollbackCompleteZwReadOnlyEnlistmentZwSinglePhaseReject來修改虛擬時鐘值。

進階交易管理員 可以將新值傳遞至 ZwPrepareEnlistmentZwPrepareEnlistmentZwCommitEnlistmentZwReadOnlyEnlistment來修改虛擬時鐘值。

此外,使用 ResourceManagerNotification 回呼常式的資源管理員或上層交易管理員可以修改回呼常式收到的虛擬時鐘值。 KTM 接著會儲存更新的值。

如果資源管理員或上層交易管理員將新的時鐘值傳遞至 KTM,則只有在 KTM 大於目前的時鐘值時,KTM 才會儲存新的值。 否則,KTM 會保留目前的時鐘值。

資源管理員和上層交易管理員可以藉由呼叫 ZwQueryInformationTransactionManager 常式來取得交易管理員物件的虛擬時鐘值。