Usando valores de relógio virtual
KTM fornece um relógio virtual para cada objeto do gerenciador de transações. Quando um gerenciador de recursos chama ZwCreateTransactionManager, o KTM define o valor do relógio virtual do objeto como 1. KTM incrementa o valor do relógio virtual sempre que uma operação de confirmação é iniciada. Sempre que o KTM grava em seu fluxo de log, ele inclui o valor do relógio virtual atual no registro de log.
Quando um gerenciador de recursos chama ZwRecoverTransactionManager, o KTM lê registros de fluxo de log até o final do fluxo e define o valor do relógio virtual do objeto do gerenciador de transações como o último valor encontrado no fluxo de log do objeto.
Quando um gerenciador de recursos chama ZwRollforwardTransactionManager, o KTM lê registros de fluxo de log até o valor de relógio especificado e define o valor do relógio virtual do objeto do gerenciador de transações como o valor do relógio especificado.
O KTM permite que gerenciadores de recursos e gerentes de transações superiores modifiquem o valor do relógio virtual de um objeto do gerenciador de transações, mas normalmente não precisam modificar o valor do relógio.
Quando modificar valores de relógio virtual
Normalmente, o TPS (sistema de processamento de transações) não precisa modificar valores de relógio virtual, a menos que os componentes no TPS estejam tentando sincronizar vários fluxos de log.
Por exemplo, suponha que o TPS contenha vários gerenciadores de recursos que se comunicam entre si durante as sequências de pré-preparação/preparação/confirmação. Suponha também que cada gerenciador de recursos crie um objeto do gerenciador de transações que tenha um fluxo de log exclusivo. Para garantir que o KTM restaure o estado de todos os gerenciadores de recursos para o mesmo ponto no tempo durante uma operação de recuperação, esses gerenciadores de recursos podem usar as seguintes etapas:
Quando um gerenciador de recursos se comunica com outro, ele passa o valor de relógio virtual mais recente que recebeu da KTM ou de outro gerenciador de recursos.
Sempre que um gerenciador de recursos chama uma rotina KTM que aceita um valor de relógio virtual (consulte a seção a seguir neste tópico), ele passa o valor de relógio mais alto que recebeu da KTM ou de outro gerenciador de recursos.
Cada gerenciador de recursos grava valores de relógio virtual em seu fluxo de log e usa esses valores quando executa operações de reversão ou recuperação.
Essas etapas fazem com que os valores de relógio virtual armazenados pela KTM para cada objeto do gerenciador de transações correspondam quase ou exatamente. Portanto, quando uma operação de recuperação faz com que o KTM leia seus fluxos de log ou quando uma operação de reversão faz com que os gerenciadores de recursos leiam seus fluxos de log, a recuperação ou reversão é baseada em fluxos de log sincronizados.
Como modificar valores de relógio virtual
Os gerenciadores de recursos podem modificar o valor do relógio virtual passando um novo valor para ZwPrePrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment ou ZwSinglePhaseReject.
Os gerenciadores de transações superiores podem modificar o valor do relógio virtual passando um novo valor para ZwPreprepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment ou ZwReadOnlyEnlistment.
Além disso, um gerenciador de recursos ou um gerenciador de transações superior que usa uma rotina de retorno de chamada ResourceManagerNotification pode modificar o valor do relógio virtual que a rotina de retorno de chamada recebe. KTM salva o valor atualizado.
Se um gerenciador de recursos ou um gerenciador de transações superior passar um novo valor de relógio para KTM, o KTM salvará o novo valor somente se ele for maior que o valor atual do relógio. Caso contrário, o KTM manterá o valor atual do relógio.
Os gerenciadores de recursos e os gerenciadores de transações superiores podem obter o valor do relógio virtual de um objeto do gerenciador de transações chamando a rotina ZwQueryInformationTransactionManager .