Notificaciones de transacción
KTM proporciona una cola de notificaciones para cada administrador de recursos. KTM entrega notificaciones a un administrador de recursos colocandolas en la cola del administrador de recursos.
Un administrador de recursos puede recuperar notificaciones de su cola de forma sincrónica o asincrónica.
Para recuperar notificaciones de forma sincrónica, el administrador de recursos puede llamar repetidamente a ZwGetNotificationResourceManager.
Para recibir notificaciones de forma asincrónica, el administrador de recursos puede llamar a TmEnableCallbacks para configurar una rutina de devolución de llamada. KTM llama a la rutina de devolución de llamada cada vez que coloca una notificación en la cola del administrador de recursos.
Cuando un administrador de recursos llama a ZwCreateEnlistment para crear una inscripción para una transacción, el administrador de recursos especifica los tipos de notificaciones que debe recibir. Los administradores de recursos solo reciben notificaciones que se registran para recibir.
Las constantes de notificación se definen en Ktmtypes.h. Los nombres de constantes de notificación tienen un formato de TRANSACTION_NOTIFY_Xxx.
En el resto de este tema se enumeran todas las constantes de notificación que Ktmtypes.h define y las divide en tres grupos:
Notificaciones que los administradores de recursos pueden recibir
Notificaciones que pueden recibir administradores de transacciones superiores
Constantes de notificación definidas pero que no se usan actualmente
Notificaciones para administradores de recursos
Todos los administradores de recursos deben registrarse para recibir TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE y TRANSACTION_NOTIFY_COMMIT notificaciones, incluso si posteriormente llaman a ZwReadOnlyEnlistment para marcar una inscripción como de solo lectura.
Los administradores de recursos pueden admitir TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT, pero también deben admitir las notificaciones de preparación previa, preparación y confirmación de varias fases.
La lista siguiente contiene todas las notificaciones que pueden recibir los administradores de recursos:
TRANSACTION_NOTIFY_PREPREPARE
Cuando se envía: un cliente llama a ZwCommitTransaction y ningún administrador de recursos admite la confirmación de una sola fase, o si un administrador de transacciones superior llama a ZwPrePrepareEnlistment.
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: realice operaciones previas a la preparación y, a continuación, llame a ZwPrePrepareComplete. (Para obtener más información sobre las operaciones de preparación previa, consulte Control de las operaciones de confirmación).
Restricciones: El administrador de recursos también debe admitir TRANSACTION_NOTIFY_PREPARE y TRANSACTION_NOTIFY_COMMIT.
TRANSACTION_NOTIFY_PREPARE
Cuando se envía: después de TRANSACTION_NOTIFY_PREPREPARE si un cliente llama a ZwCommitTransaction y ningún administrador de recursos admite la confirmación de una sola fase, o si un administrador de transacciones superior llama a ZwPrepareEnlistment.
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: Realice operaciones de preparación y, a continuación, llame a ZwPrepareComplete. (Para obtener más información sobre las operaciones de preparación, consulte Control de operaciones de confirmación).
Restricciones: El administrador de recursos también debe admitir TRANSACTION_NOTIFY_PREPREPARE y TRANSACTION_NOTIFY_COMMIT.
TRANSACTION_NOTIFY_COMMIT
Cuando se envía: después de TRANSACTION_NOTIFY_PREPARE si un cliente llama a ZwCommitTransaction y ningún administrador de recursos admite la confirmación de una sola fase, o si un administrador de transacciones superior llama a ZwCommitEnlistment.
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: realice operaciones de confirmación y, a continuación, llame a ZwCommitComplete. (Para obtener más información sobre las operaciones de confirmación, consulte Control de las operaciones de confirmación).
Restricciones: El administrador de recursos también debe admitir TRANSACTION_NOTIFY_PREPREPARE y TRANSACTION_NOTIFY_PREPARE.
TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT
Cuando se envía: un cliente llama a ZwCommitTransaction y un administrador de recursos admite operaciones de confirmación de fase única.
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: confirme la transacción o llame a ZwSinglePhaseReject. (Para obtener más información sobre las operaciones de confirmación de fase única, consulte Control de las operaciones de confirmación).
Restricciones: El administrador de recursos también debe admitir TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE y TRANSACTION_NOTIFY_COMMIT.
TRANSACTION_NOTIFY_ROLLBACK
Cuando se envía: un cliente llama a ZwRollbackTransaction, un administrador de transacciones superior llama a ZwRollbackEnlistment o KTM detecta un error (por ejemplo, una escritura errónea en la secuencia de registro).
Recibido por: administradores de recursos y administradores de transacciones superiores.
Acción necesaria del destinatario: realice las operaciones necesarias para revertir los datos de la transacción y, a continuación, llame a ZwRollbackComplete. (Para obtener más información sobre las operaciones de reversión, consulte Control de las operaciones de reversión).
Restricciones: Todos los administradores de recursos y los administradores de transacciones superiores deben admitir TRANSACTION_NOTIFY_ROLLBACK.
TRANSACTION_NOTIFY_RECOVER
Cuando se envía: un administrador de recursos llama a ZwRecoverResourceManager.
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: el administrador de recursos debe llamar a ZwRecoverEnlistment. (Para obtener más información sobre las operaciones de recuperación, consulte Control de operaciones de recuperación).
Restricciones: ninguna.
TRANSACTION_NOTIFY_LAST_RECOVER
Cuando se envía: después de que KTM haya enviado el último TRANSACTION_NOTIFY_RECOVER para las inscripciones de un administrador de recursos.
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: finalice la operación de recuperación. (Para obtener más información sobre las operaciones de recuperación, consulte Control de operaciones de recuperación).
Restricciones: ninguna.
TRANSACTION_NOTIFY_INDOUBT
Cuando se envía: después de que un administrador de recursos llame a ZwRecoverEnlistment, si KTM no puede determinar si la transacción debe confirmarse o revertirse (normalmente porque el TPS tiene un administrador de transacciones superior que no está disponible).
Recibido por: Administradores de recursos.
Acción necesaria del destinatario: no haga nada hasta que KTM envíe TRANSACTION_NOTIFY_COMMIT o TRANSACTION_NOTIFY_ROLLBACK.
Restricciones: ninguna.
TRANSACTION_NOTIFY_RM_DISCONNECTED
Cuando se envía: el administrador de recursos que controla una 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.
Recibido por: Administradores de recursos y administradores de transacciones superiores que tienen inscripciones para la transacción.
Acción necesaria del destinatario: operaciones de limpieza específicas de la transacción. Normalmente, esta notificación es útil para administradores de recursos de solo lectura.
Restricciones: ninguna.
Notificaciones para administradores de transacciones superiores
Los administradores de transacciones superiores pueden recibir las siguientes notificaciones:
TRANSACTION_NOTIFY_ROLLBACK
Consulte la descripción anterior.
TRANSACTION_NOTIFY_RM_DISCONNECTED
Consulte la descripción anterior.
TRANSACTION_NOTIFY_PREPREPARE_COMPLETE
Cuando se envía: después de que todos los administradores de recursos hayan recibido TRANSACTION_NOTIFY_PREPREPARE y respondido llamando a ZwPrepareComplete.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: el administrador de transacciones superior debe llamar a ZwPrepareEnlistment.
TRANSACTION_NOTIFY_PREPARE_COMPLETE
Cuando se envían: después de que todos los administradores de recursos hayan recibido TRANSACTION_NOTIFY_PREPARE y respondan llamando a ZwPrepareComplete.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: el administrador de transacciones superior debe llamar a ZwCommitEnlistment.
TRANSACTION_NOTIFY_COMMIT_COMPLETE
Cuando se envían: después de que todos los administradores de recursos hayan recibido TRANSACTION_NOTIFY_COMMIT y respondido llamando a ZwCommitComplete.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: operaciones de limpieza de transacciones.
TRANSACTION_NOTIFY_ROLLBACK_COMPLETE
Cuando se envían: después de que todos los administradores de recursos hayan recibido TRANSACTION_NOTIFY_ROLLBACK y respondieron llamando a ZwRollbackComplete.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: operaciones de limpieza de transacciones.
TRANSACTION_NOTIFY_RECOVER_QUERY
Cuando se envía: un administrador de transacciones superior llama a ZwRecoverResourceManager.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: el administrador de transacciones superior debe llamar a ZwCommitEnlistment o ZwRollbackEnlistment para la inscripción.
TRANSACTION_NOTIFY_COMMIT_REQUEST
Cuando se envía: un cliente llama a ZwCommitTransaction. Si un administrador de transacciones superior se ha registrado para esta notificación para una inscripción, KTM envía TRANSACTION_NOTIFY_COMMIT_REQUEST al administrador de transacciones superior en lugar de enviar TRANSACTION_NOTIFY_COMMIT a los administradores de recursos.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: el administrador de transacciones superior llama a ZwCommitEnlistment.
TRANSACTION_NOTIFY_REQUEST_OUTCOME
Cuando se envía: un administrador de recursos llama a TmRequestOutcomeEnlistment mientras la transacción está en su estado preparado.
Recibido por: Administradores de transacciones superiores.
Acción necesaria del destinatario: el administrador de transacciones superior debe llamar a ZwCommitEnlistment o ZwRollbackEnlistment.
Notificaciones sin usar
Las siguientes notificaciones se definen en Ktmtypes.h, pero KTM actualmente no las admite:
TRANSACTION_NOTIFY_DELEGATE_COMMIT
TRANSACTION_NOTIFY_ENLIST_MASK
TRANSACTION_NOTIFY_ENLIST_PREPREPARE
TRANSACTION_NOTIFY_MARSHAL
TRANSACTION_NOTIFY_PROMOTE
TRANSACTION_NOTIFY_PROMOTE_NEW
TRANSACTION_NOTIFY_PROPAGATE_PULL
TRANSACTION_NOTIFY_PROPAGATE_PUSH
TRANSACTION_NOTIFY_TM_ONLINE
TRANSACTION_NOTIFY_COMMIT_FINALIZE