Control de las operaciones de recuperación

En una operación de recuperación , un sistema de procesamiento de transacciones (TPS) intenta recuperar su estado de la información que se encuentra en flujos de registro. Una vez completada una operación de recuperación, todas las transacciones deben estar en un estado confirmado o revertible, y todos los datos de recursos deben estar en un estado correcto conocido.

A veces, un TPS se detiene antes de que finalicen todas sus transacciones. Por ejemplo, el sistema operativo podría bloquearse. Por lo tanto, los administradores de recursos deben iniciar operaciones de recuperación cada vez que empiecen a ejecutarse. La operación de recuperación intenta determinar si las transacciones están incompletas. Si se encuentran transacciones incompletas en el registro, la operación de recuperación intenta confirmar o revertir esas transacciones.

Para un TPS basado en KTM, cada operación de recuperación consta de dos pasos. El primer paso implica recuperar información del flujo de registro del objeto del administrador de transacciones. El segundo paso implica recuperar información del flujo de registro del administrador de recursos.

Un TPS puede recuperarse al final de todas las secuencias de registro o, si sus administradores de recursos mantienen valores de reloj virtual, puede recuperarse hasta un valor de reloj especificado.

Recuperar información de un flujo de registro de un objeto de Administrador de transacciones

Inmediatamente después de que un administrador de recursos llame a ZwCreateTransactionManager o ZwOpenTransactionManager, debe llamar a ZwRecoverTransactionManager. La rutina ZwRecoverTransactionManager lee la secuencia de registro que pertenece al objeto del administrador de transacciones. Esta rutina reconstruye el estado del objeto del administrador de transacciones (incluidas todas las transacciones, las inscripciones y los administradores de recursos) a partir de la información de recuperación que se encuentra en el flujo de registro, comenzando en el último área de reinicio que KTM creó y terminaba al final de la secuencia.

Para recuperarse del último área de reinicio hasta un valor de reloj virtual especificado, el administrador de recursos puede llamar a ZwRollforwardTransactionManager en lugar de ZwRecoverTransactionManager.

Recuperación de información de un flujo de registro de Resource Manager

Inmediatamente después de que un administrador de recursos llame a ZwCreateResourceManager o ZwOpenResourceManager, debe llamar a ZwRecoverResourceManager. La rutina ZwRecoverResourceManager intenta recuperar las transacciones asociadas a cada una de las inscripciones del administrador de recursos.

Cuando un administrador de recursos llama a ZwRecoverResourceManager, KTM envía TRANSACTION_NOTIFY_RECOVER notificaciones para cada una de las inscripciones del administrador de recursos. El administrador de recursos debe llamar a ZwRecoverEnlistment cada vez que reciba una de las notificaciones TRANSACTION_NOTIFY_RECOVER.

Cuando el administrador de recursos llama a ZwRecoverEnlistment, KTM envía una de las siguientes notificaciones:

  • TRANSACTION_NOTIFY_COMMIT

    El administrador de recursos debe usar información en su flujo de registro para confirmar la transacción y, a continuación, debe llamar a ZwCommitComplete.

  • TRANSACTION_NOTIFY_ROLLBACK

    El administrador de recursos debe usar información en su flujo de registro para revertir la transacción y, a continuación, debe llamar a ZwRollbackComplete.

  • TRANSACTION_NOTIFY_INDOUBT

    KTM no ha determinado el estado de la transacción y enviará una notificación de confirmación o reversión más adelante.

Normalmente, KTM envía una notificación de TRANSACTION_NOTIFY_COMMIT si determina que todos los administradores de recursos llamados ZwPrepareComplete antes de que el TPS se detenga y reinicie. KTM envía una notificación de TRANSACTION_NOTIFY_ROLLBACK si determina que uno o varios administradores de recursos no llamaron a ZwPrepareComplete.

Una vez que KTM ha enviado una notificación de TRANSACTION_NOTIFY_RECOVER para cada inscripción, envía una notificación TRANSACTION_NOTIFY_LAST_RECOVER.

Si el administrador de recursos llamó a ZwRollforwardTransactionManager en lugar de ZwRecoverTransactionManager, solo debe recuperarse hasta el valor del reloj virtual que especificó en ZwRollforwardTransactionManager.

Los administradores de recursos pueden llamar a ZwSetInformationEnlistment para establecer información de recuperación personalizada. KTM guarda esta información y la escribe en el flujo de registro, pero KTM no intenta interpretar la información. El administrador de recursos puede recuperar la información de recuperación en cualquier momento llamando a ZwQueryInformationEnlistment.

Los administradores de transacciones superiores a veces reciben notificaciones TRANSACTION_NOTIFY_RECOVER_QUERY durante una operación de recuperación.