Creación de un Resource Manager

Los administradores de recursos mantienen los datos de cada transacción y registran las operaciones de la transacción. Si un sistema de procesamiento de transacciones (TPS) tiene varios administradores de recursos, cada administrador de recursos puede participar en las operaciones de confirmación, reversión y recuperación de cada transacción.

Cada administrador de recursos debe exportar una interfaz que los clientes transaccionales puedan usar para tener acceso a la base de datos u otro recurso que mantiene el administrador de recursos.

Normalmente, un administrador de recursos en modo kernel debe realizar las siguientes tareas en el orden indicado:

  1. Cree una secuencia de registro.

    Los administradores de recursos pueden usar el sistema de archivos de registro común (CLFS) o alguna otra funcionalidad de registro para mantener sus flujos de registro. Una llamada a ClfsCreateLogFile crea una secuencia de registro clFS. El administrador de recursos debe usar la secuencia de registro para registrar cualquier información que requiera para confirmar, revertir o recuperar transacciones. Además, KTM usa la secuencia de registro para registrar los cambios de estado internos que podrían ser necesarios para recuperar transacciones.

  2. Cree un objeto de administrador de transacciones.

    Una llamada a ZwCreateTransactionManager crea un objeto de administrador de transacciones y conecta el administrador de recursos a una secuencia de registro CLFS adicional que especifica el administrador de recursos.

  3. Recupere el estado del administrador de transacciones.

    Una llamada a ZwRecoverTransactionManager lee la secuencia de registro del objeto del administrador de transacciones (que mantiene KTM) y determina si el TPS se cerró antes de que se completaran todas las transacciones (por ejemplo, porque el sistema se bloqueó). KTM restaura su estado interno en función de la información del flujo de registro.

  4. Cree un objeto de Resource Manager.

    Una llamada a ZwCreateResourceManager crea un objeto de administrador de recursos y lo asocia al objeto de administrador de transacciones creado anteriormente.

  5. Recupere el estado del administrador de recursos.

    Una llamada a ZwRecoverResourceManager hace que KTM envíe las notificaciones del administrador de recursos TRANSACTION_NOTIFY_RECOVER de las transacciones que estaban en curso la última vez que se cerró el administrador de recursos. Para obtener información sobre cómo el administrador de recursos debe responder a estas notificaciones, consulte Control de operaciones de recuperación.

  6. Recibir transacciones de clientes.

    Normalmente, un cliente crea un objeto de transacción y usa la interfaz de cliente del administrador de recursos para pasar el GUID del objeto de transacción al administrador de recursos. Por ejemplo, el administrador de recursos podría proporcionar una rutina CreateDataObject similar a la que describe el tema Descripción de los componentes de TPS .

  7. Inscribirse en cada transacción.

    Una llamada a ZwOpenTransaction abre un identificador para el objeto de transacción y, a continuación, una llamada a ZwCreateEnlistment crea una inscripción para la transacción. La inscripción permite al administrador de recursos recibir un conjunto especificado de notificaciones de transacción.

  8. Habilite la recepción de notificaciones de transacciones.

    El administrador de recursos puede llamar a ZwGetNotificationResourceManager para obtener notificaciones de forma sincrónica, o puede llamar a TmEnableCallbacks para registrar una rutina de devolución de llamada ResourceManagerNotification a la que KTM llama cada vez que hay una notificación disponible.

  9. Las solicitudes de acceso a recursos de servicio de los clientes, pero no hacen que los cambios sean permanentes.

    Una vez que un cliente ha creado un objeto de transacción, normalmente llama a la interfaz del administrador de recursos para acceder al recurso del administrador de recursos. Por ejemplo, un administrador de recursos para una base de datos podría recibir solicitudes de lectura y escritura en la base de datos.

    El administrador de recursos debe registrar los resultados de las operaciones de lectura y escritura en una secuencia de registro clFS u otra funcionalidad de registro hasta que reciba una notificación de que las operaciones de la transacción se confirmarán, revertirán o recuperarán.

  10. Confirme o revierte las operaciones de cliente.

    Finalmente, el administrador de recursos recibe una notificación para comenzar a confirmar o revertir las operaciones que ha realizado el cliente. En respuesta, el administrador de recursos debe hacer que las operaciones de cliente sean permanentes o descartarlas. Para obtener más información sobre cómo controlar las notificaciones de confirmación y reversión, consulte Control de operaciones de transacción.

    En ocasiones, es posible que un administrador de recursos tenga que intentar forzar A KTM a proporcionar rápidamente una notificación de confirmación o reversión, quizás porque el administrador de recursos ha determinado que un dispositivo se quitó por sorpresa. En tal caso, el administrador de recursos puede llamar a TmRequestOutcomeEnlistment.

  11. Cierre el identificador del objeto de inscripción.

    Una vez que el administrador de recursos haya terminado de procesar la transacción, debe llamar a ZwClose para cerrar el identificador del objeto de inscripción.

  12. Cierre el identificador de objeto del administrador de recursos y el identificador de objeto del administrador de transacciones.

    Antes de que el administrador de recursos se descargue, debe llamar a ZwClose para cerrar el identificador del objeto del administrador de recursos y el identificador del objeto del administrador de transacciones.

Los pasos del 1 al 5 deben realizarse en el código de inicialización del administrador de recursos. Por ejemplo, si el administrador de recursos es un controlador en modo kernel, el código de inicialización es la rutina DriverEntry del controlador.

Los pasos del 6 al 11 se realizan normalmente en el código que responde a las solicitudes de los clientes transaccionales.

El paso 12 debe realizarse en el código de limpieza final del administrador de recursos, como una rutina de descarga del controlador en modo kernel.

Creación de una inscripción de Read-Only

Una inscripción de solo lectura es una inscripción que no recibe ninguna notificación de KTM. Un administrador de recursos puede hacer que cualquier inscripción sea de solo lectura mediante una llamada a ZwReadOnlyEnlistment. Esta llamada hace que KTM deje de entregar notificaciones al administrador de recursos.

Una vez que el administrador de recursos haya llamado a ZwCreateEnlistment, puede llamar a ZwReadOnlyEnlistment en cualquier momento hasta el momento en el que normalmente llamaría a ZwPrepareComplete.

Hay dos razones por las que es posible que quiera que el administrador de recursos llame a ZwReadOnlyEnlistment.

  • El administrador de recursos ha participado en una transacción y, en algún momento antes de recibir una notificación de TRANSACTION_NOTIFY_COMMIT, el administrador de recursos determina que ya no tiene que participar en la operación de confirmación de la transacción.

    Por ejemplo, cuando el administrador de recursos recibe una notificación de TRANSACTION_NOTIFY_PREPARE, podría determinar que ninguna de las operaciones de la transacción ha cambiado la base de datos del administrador de recursos. El administrador de recursos puede llamar a ZwReadOnlyEnlistment en lugar de ZwPrepareComplete para quitarse de la transacción.

  • El administrador de recursos nunca participa en la operación de confirmación de ninguna transacción.

    Por ejemplo, el administrador de recursos podría supervisar los datos que envía el cliente, sin modificar ninguna base de datos almacenada. En este caso, el administrador de recursos podría llamar a ZwReadOnlyEnlistment inmediatamente después de llamar a ZwCreateEnlistment. Además, puede optar por que este tipo de administrador de recursos sea volátil, como se describe en la sección siguiente de este tema.

Una vez que un administrador de recursos ha llamado ZwReadOnlyEnlistment, puede llamar a ZwClose para cerrar el identificador de inscripción.

Creación de un administrador de Volatile-Resource

Un administrador de recursos volátiles es un administrador de recursos que no mantiene datos duraderos. Por ejemplo, puede crear un administrador de recursos volátiles para supervisar los datos que envía el cliente, si el administrador de recursos no modifica una base de datos almacenada de forma duradera. Normalmente, los administradores de recursos volátiles no registran la actividad de transacción y, por lo tanto, no pueden realizar operaciones de recuperación o reversión.

Un administrador de recursos volátiles debe establecer la marca RESOURCE_MANAGER_VOLATILE cuando llama a ZwCreateResourceManager. Si se establece esta marca, KTM no registra ninguna información sobre el administrador de recursos en la secuencia de registro del objeto de administrador de transacciones asociado.

El administrador de recursos también puede establecer una marca de TRANSACTION_MANAGER_VOLATILE cuando llama a ZwCreateTransactionManager. Si se establece esta marca, KTM no crea un flujo de registro para el objeto del administrador de transacciones. Además, los administradores de recursos adicionales que estén conectados al objeto del administrador de transacciones también deben ser volátiles y establecer la marca RESOURCE_MANAGER_VOLATILE.

Adición de un Resource Manager a un TPS existente

Si tiene que agregar un administrador de recursos adicional a un TPS existente, tiene dos opciones:

  • El nuevo administrador de recursos llama a ZwCreateTransactionManager para crear su propio objeto de administrador de transacciones.

    Use esta opción si el administrador de recursos no se comunica con otros administradores de recursos en el TPS.

  • El nuevo administrador de recursos llama a ZwOpenTransactionManager para conectarse a un objeto de administrador de transacciones existente.

    Use esta opción si el administrador de recursos debe comunicarse con otros administradores de recursos en el TPS. El administrador de recursos que llama a ZwCreateTransactionManager debe compartir el GUID del objeto del administrador de transacciones, el nombre del flujo de registro o el nombre del objeto para que otros administradores de recursos puedan llamar a ZwOpenTransactionManager. Estos otros administradores de recursos pueden llamar a ZwQueryInformationTransactionManager para obtener información adicional sobre el objeto del administrador de transacciones.

Después de agregar el administrador de recursos al TPS, los clientes que conocen el administrador de recursos pueden llamar a la interfaz de cliente del administrador de recursos.