Control de las operaciones de confirmación
Hay dos tipos de operaciones de confirmación: confirmación de una sola fase y confirmación de varias fases. Una operación de confirmación de una sola fase consta de una sola notificación a la que los administradores de recursos deben responder, mientras que una operación de confirmación en varias fases incluye notificaciones adicionales para los pasos de preparación.
Una operación de confirmación de una sola fase es más sencilla de implementar. Es adecuado para los sistemas de procesamiento de transacciones (TPS) que tienen una de las siguientes características:
Un único administrador de recursos.
Varios administradores de recursos, todos menos uno de los cuales son de solo lectura y no participan en la operación de confirmación.
Se necesita una operación de confirmación en varias fases si varios administradores de recursos participan en la operación de confirmación.
Operaciones de confirmación de Single-Phase
Si desea que el TPS admita operaciones de confirmación de fase única, un administrador de recursos (y solo uno) debe registrarse para recibir notificaciones TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT para sus inscripciones. Todos los demás administradores de recursos deben ser de solo lectura.
Un TPS que incluya un administrador de transacciones superior no puede usar la confirmación de una sola fase.
Si un administrador de recursos se ha registrado para recibir notificaciones TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT, KTM envía este tipo de notificación cuando un cliente transaccional llama a ZwCommitTransaction.
Cuando el administrador de recursos recibe una notificación de TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT para una transacción, puede confirmar la transacción o rechazar la confirmación de una sola fase.
Para confirmar la transacción, el administrador de recursos debe hacer lo siguiente:
Vacíe los datos que contiene en una caché no permanente (almacenamiento en memoria), como el área de serialización de CLFS para un flujo de registro clFS.
El administrador de recursos debe mover los datos de la memoria caché a un medio de almacenamiento duradero. Por ejemplo, un administrador de recursos que usa CLFS puede llamar a ClfsFlushBuffers.
Realice todos los cambios de datos permanentes y públicos (es decir, visible fuera del ámbito del administrador de recursos).
Llame a ZwCommitComplete.
Después de llamar a ZwCommitComplete, el administrador de recursos debe llamar a ZwClose para cerrar el identificador de inscripción.
Para rechazar una operación de confirmación de fase única para la transacción, el administrador de recursos puede llamar a ZwSinglePhaseReject. Si el administrador de recursos llama a ZwSinglePhaseReject, KTM cambia inmediatamente la operación de confirmación de una sola fase a varias fases.
Si otros administradores de recursos se inscriban en la misma transacción, deben ser de solo lectura. Sin embargo, deben registrarse para recibir la notificación de TRANSACTION_NOTIFY_RM_DISCONNECTED, que reciben si el administrador de recursos que controla la operación de confirmación de una sola fase cierra el identificador de inscripción sin indicar que se ha confirmado o revertido la transacción.
Operaciones de confirmación en varias fases
Una operación de confirmación en varias fases comienza cuando se produce uno de los siguientes eventos:
Un cliente transaccional llama a ZwCommitTransaction y ningún administrador de recursos se ha registrado para recibir notificaciones TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT.
Un administrador de recursos llama a ZwSinglePhaseReject después de haber recibido una notificación de TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT.
Un administrador de transacciones superior llama a ZwPrepareEnlistment.
Las operaciones de confirmación en varias fases constan de tres fases secuenciales: preparación previa, preparación y confirmación.
Fase previa a la preparación
La fase de preparación previa (también conocida como fase cero) de la operación de confirmación comienza cuando KTM envía una notificación TRANSACTION_NOTIFY_PREPREPARE a todos los administradores de recursos. KTM envía esta notificación si ningún administrador de recursos admite una operación de confirmación de fase única para la transacción, o si un administrador de transacciones superior llama a ZwPreprepareEnlistment.
Cuando cada administrador de recursos recibe la notificación TRANSACTION_NOTIFY_PREPREPARE, debe hacer lo siguiente:
Vacíe los datos que contiene en una caché no permanente (almacenamiento en memoria), como el área de serialización de CLFS para un flujo de registro clFS.
El administrador de recursos debe mover los datos de la memoria caché a un medio de almacenamiento duradero. Por ejemplo, un administrador de recursos que usa CLFS puede llamar a ClfsFlushBuffers.
Llame a ZwPrepareComplete.
Una vez que un administrador de recursos ha llamado ZwPreprepareComplete, puede seguir recibiendo y atender las solicitudes de cliente. Pero el administrador de recursos debe tratar todas las modificaciones de datos como operaciones de paso a través de caché que se escriben inmediatamente en un medio de almacenamiento duradero.
Si un administrador de recursos encuentra un error mientras procesa una notificación de TRANSACTION_NOTIFY_PREPREPARE, debe llamar a ZwRollbackEnlistment para revertir la transacción.
Fase de preparación
La fase de preparación (también conocida como fase uno) de la operación de confirmación comienza cuando KTM envía una notificación TRANSACTION_NOTIFY_PREPARE a todos los administradores de recursos. KTM envía esta notificación después de TRANSACTION_NOTIFY_PREPREPARE si ningún administrador de recursos admite la confirmación de una sola fase o si un administrador de transacciones superior llama a ZwPrepareEnlistment.
Cuando cada administrador de recursos recibe la notificación TRANSACTION_NOTIFY_PREPARE, debe hacer lo siguiente:
Detenga las solicitudes de cliente de mantenimiento e informe de las solicitudes posteriores del cliente como errores de cliente.
Asegúrese de que todos los datos se han movido al almacenamiento duradero.
Llame a ZwPrepareComplete.
Si un administrador de recursos encuentra un error mientras procesa una notificación de TRANSACTION_NOTIFY_PREPARE, debe llamar a ZwRollbackEnlistment para revertir la transacción. Sin embargo, el administrador de recursos no puede revertir la transacción después de llamar a ZwPrepareComplete.
Fase de confirmación
La fase de confirmación (también conocida como fase dos) de la operación de confirmación comienza cuando KTM envía una notificación TRANSACTION_NOTIFY_COMMIT a todos los administradores de recursos. KTM envía esta notificación después de TRANSACTION_NOTIFY_PREPARE si ningún administrador de recursos admite la confirmación de una sola fase o si un administrador de transacciones superior llama a ZwCommitEnlistment.
Cuando cada administrador de recursos recibe la notificación TRANSACTION_NOTIFY_COMMIT, debe hacer lo siguiente:
Realice todos los cambios de datos permanentes y públicos (es decir, visibles para otras transacciones).
Normalmente, un administrador de recursos realiza cambios permanentes y públicos copiando los datos guardados de la transacción del flujo de registro en el almacenamiento público y permanente de la base de datos. Para obtener más información sobre cómo usar secuencias de registro, consulte Uso de secuencias de registro con KTM.
Llame a ZwCommitComplete.
Una vez que el administrador de recursos llama a ZwCommitComplete, debe llamar a ZwClose para cerrar el identificador de inscripción.
Si un administrador de recursos encuentra un error mientras está procesando una notificación de TRANSACTION_NOTIFY_COMMIT, debe apagarse. La próxima vez que el sistema operativo vuelva a cargar el administrador de recursos, el proceso de recuperación del administrador de recursos debe restaurar la transacción a un estado que se sabe que es bueno antes de que se produjera el error.