Realizar la recuperación
El administrador de recursos facilita la resolución de inscripciones duraderas en una transacción volviendo a inscribir al participante de la transacción después de un error de recurso.
El Proceso de la recuperación
Para dar de alta de forma duradera a un recurso (se describe por una implementación de la interfaz IEnlistmentNotification) que puede ser después elegible para la recuperación, debería llamar al método EnlistDurable. Además, debe proporcionar un identificador del administrador de recursos (un EnlistDurable) que se utiliza para etiquetar de forma consistente al participante de la transacción en caso de un error de recurso al método Guid. Por esta razón, el Guid que se proporcionan a la llamada de inscripción inicial debería ser idéntica al parámetro resourceManagerIdentifier en la llamada Reenlist durante la recuperación. De lo contrario, se produce TransactionException. Para obtener más información sobre las inscripciones duraderas, consulte Inscripción de recursos como participantes en una transacción.
En la fase de preparación (fase 1) del protocolo 2PC, cuando su implementación de un administrador de recursos duradero recibe la notificación Prepare, debería registrar su registro de preparación durante esta fase. El registro debería contener toda la información que es necesaria para completar la transacción en confirmación. Se puede tener acceso al registro de preparación después, durante la recuperación, recuperando la propiedad RecoveryInformation de la devolución de llamada preparingEnlistment. El registro del registro no necesita ser realizado dentro del método Prepare cuando RM puede hacer esto en un subproceso de trabajo.
El proceso de recuperación consiste de los dos siguientes pasos:
El paso 1 - ReEnlist
El administrador de recursos examina el registro de preparación de la información para cada inscripción que está dudosa. Esto se hace examinando la propiedad RecoveryInformation de la devolución de llamada PreparingEnlistment, que se pasa al administrador de recursos en la notificación Prepare durante fase 1.
Para cada inscripción que examina, invoca Reenlist en el administrador de transacciones. Este método pasa en un Guid único que identifica el administrador de recursos, así como la información de la inscripción en una matriz de bytes. Se devuelve un objeto nuevo Enlistment . En caso de error en el reenganche con una excepción, el administrador de recursos necesitará reintentar en un momento posterior.
Solo debería llamar al Reenlist método si un administrador de recursos se reinicia a partir de un error. Además, solo debería volver a inscribir las transacciones sin resolver registradas por un administrador de recursos durante fase de preparación inicial de una confirmación en dos fases. Cualquier intento de llamar a este método en momentos que no corresponda puede generar resultados erróneos.
Cuando se vuelve a inscribir un participante con este método, se llama a los métodos de la fase 2 de IEnlistmentNotification que corresponden al resultado de la transacción (es decir, Commit, Rollback o InDoubt) según sea adecuado.
El paso 2 - Completando la recuperación
Cuando todas las inscripciones hayan finalizado el administrador de recursos llamará al método RecoveryComplete. Este método completa la recuperación e informa el administrador de transacciones de que el administrador de recursos no tiene ninguna transacción dudosa más. Haciendo esto, el administrador de recursos garantiza que no invocará de nuevo el método Reenlist.
No se exige a un administrador de recursos que resuelva todas las transacciones dudosas antes de dar de alta nuevas transacciones. Se puede realizar el primer paso en cualquier momento después de que el administrador de recursos establezca una relación con el administrador de transacciones, pero una vez invocado RecoveryComplete (el paso 2) ; no se puede realizar el paso 1 de nuevo. El paso 2 se puede repetir varias veces sin afectar al resultado de transacciones.