Compartir a través de


Uso de valores de reloj virtual

KTM proporciona un reloj virtual para cada objeto del administrador de transacciones. Cuando un administrador de recursos llama a ZwCreateTransactionManager, KTM establece el valor del reloj virtual del objeto en 1. KTM incrementa el valor del reloj virtual cada vez que comienza una operación de confirmación. Cada vez que KTM escribe en su flujo de registro, incluye el valor del reloj virtual actual en el registro de registro.

Cuando un administrador de recursos llama a ZwRecoverTransactionManager, KTM lee los registros de secuencia de registro hasta el final de la secuencia y establece el valor del reloj virtual del objeto del administrador de transacciones en el último valor que encuentra en el flujo de registro del objeto.

Cuando un administrador de recursos llama a ZwRollforwardTransactionManager, KTM lee los registros de secuencia de registro hasta el valor de reloj especificado y establece el valor del reloj virtual del objeto del administrador de transacciones en el valor de reloj especificado.

KTM permite a los administradores de recursos y administradores de transacciones superiores modificar el valor del reloj virtual de un objeto de administrador de transacciones, pero normalmente no tienen que modificar el valor del reloj.

Cuándo modificar valores de reloj virtual

Normalmente, el sistema de procesamiento de transacciones (TPS) no tiene que modificar los valores de reloj virtual a menos que los componentes de TPS intenten sincronizar varias secuencias de registro.

Por ejemplo, supongamos que el TPS contiene varios administradores de recursos que se comunican entre sí durante las secuencias de preparación previa, preparación, preparación y confirmación. Suponga también que cada administrador de recursos crea un objeto de administrador de transacciones que tiene un flujo de registro único. Para asegurarse de que KTM restaura el estado de todos los administradores de recursos al mismo momento en el tiempo durante una operación de recuperación, estos administradores de recursos pueden usar los pasos siguientes:

  • Cuando un administrador de recursos se comunica con otro, pasa el valor de reloj virtual más reciente que ha recibido de KTM o de otro administrador de recursos.

  • Cada vez que un administrador de recursos llama a una rutina de KTM que acepta un valor de reloj virtual (consulte la sección siguiente de este tema), pasa el valor de reloj más alto que ha recibido de KTM u otro administrador de recursos.

  • Cada administrador de recursos escribe valores de reloj virtual en su flujo de registro y usa esos valores cuando realiza operaciones de reversión o recuperación.

Estos pasos hacen que los valores del reloj virtual que KTM almacena para cada objeto del administrador de transacciones coincidan casi o exactamente. Por lo tanto, cuando una operación de recuperación hace que KTM lea sus flujos de registro, o cuando una operación de reversión hace que los administradores de recursos lean sus flujos de registro, la recuperación o reversión se basa en flujos de registro sincronizados.

Cómo modificar valores de reloj virtual

Los administradores de recursos pueden modificar el valor del reloj virtual pasando un nuevo valor a ZwPrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment o ZwSinglePhaseReject.

Los administradores de transacciones superiores pueden modificar el valor del reloj virtual pasando un nuevo valor a ZwPrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment o ZwReadOnlyEnlistment.

Además, un administrador de recursos o un administrador de transacciones superior que usa una rutina de devolución de llamada ResourceManagerNotification puede modificar el valor del reloj virtual que recibe la rutina de devolución de llamada. A continuación, KTM guarda el valor actualizado.

Si un administrador de recursos o un administrador de transacciones superior pasa un nuevo valor de reloj a KTM, KTM guarda el nuevo valor solo si es mayor que el valor del reloj actual. De lo contrario, KTM mantiene el valor del reloj actual.

Los administradores de recursos y los administradores de transacciones superiores pueden obtener el valor de reloj virtual de un objeto de administrador de transacciones llamando a la rutina ZwQueryInformationTransactionManager .