Gestion des opérations de récupération

Dans une opération de récupération , un système de traitement transactionnel (TPS) tente de récupérer son état à partir des informations contenues dans les flux de journaux. Une fois l’opération de récupération terminée, toutes les transactions doivent être dans un état de validation ou de restauration, et toutes les données de ressources doivent être dans un état correct connu.

Parfois, un TPS s’arrête avant la fin de toutes ses transactions. Par exemple, le système d’exploitation peut se bloquer. Par conséquent, les gestionnaires de ressources doivent lancer des opérations de récupération chaque fois qu’ils commencent à s’exécuter. L’opération de récupération tente de déterminer si des transactions sont incomplètes. Si des transactions incomplètes sont trouvées dans le journal, l’opération de récupération tente de valider ou de restaurer ces transactions.

Pour un TPS basé sur KTM, chaque opération de récupération se compose de deux étapes. La première étape consiste à récupérer des informations à partir du flux de journal de l’objet gestionnaire de transactions. La deuxième étape consiste à récupérer des informations à partir du flux de journaux du gestionnaire de ressources.

Un TPS peut récupérer jusqu’à la fin de tous les flux de journaux ou, si ses gestionnaires de ressources conservent des valeurs d’horloge virtuelle, il peut récupérer jusqu’à une valeur d’horloge spécifiée.

Récupération d’informations à partir du flux de journaux d’un objet Gestionnaire de transactions

Immédiatement après qu’un gestionnaire de ressources a appelé ZwCreateTransactionManager ou ZwOpenTransactionManager, il doit appeler ZwRecoverTransactionManager. La routine ZwRecoverTransactionManager lit le flux de journal qui appartient à l’objet gestionnaire de transactions. Cette routine reconstruit l’état de l’objet gestionnaire de transactions (y compris toutes les transactions, les inscriptions et les gestionnaires de ressources) à partir des informations de récupération qui se trouve dans le flux de journal, en commençant à la dernière zone de redémarrage créée par KTM et se terminant à la fin du flux.

Pour récupérer à partir de la dernière zone de redémarrage jusqu’à une valeur d’horloge virtuelle spécifiée, le gestionnaire de ressources peut appeler ZwRollforwardTransactionManager au lieu de ZwRecoverTransactionManager.

Récupération d’informations à partir du flux de journaux d’un Resource Manager

Immédiatement après qu’un gestionnaire de ressources a appelé ZwCreateResourceManager ou ZwOpenResourceManager, il doit appeler ZwRecoverResourceManager. La routine ZwRecoverResourceManager tente de récupérer les transactions associées à chacune des inscriptions du gestionnaire de ressources.

Lorsqu’un gestionnaire de ressources appelle ZwRecoverResourceManager, KTM envoie TRANSACTION_NOTIFY_RECOVER notifications pour chacune des inscriptions du gestionnaire de ressources. Le gestionnaire de ressources doit appeler ZwRecoverEnlistment chaque fois qu’il reçoit l’une des notifications TRANSACTION_NOTIFY_RECOVER.

Lorsque le gestionnaire de ressources appelle ZwRecoverEnlistment, KTM envoie l’une des notifications suivantes :

  • TRANSACTION_NOTIFY_COMMIT

    Le gestionnaire de ressources doit utiliser les informations de son flux de journal pour valider la transaction, puis appeler ZwCommitComplete.

  • TRANSACTION_NOTIFY_ROLLBACK

    Le gestionnaire de ressources doit utiliser les informations de son flux de journal pour restaurer la transaction, puis appeler ZwRollbackComplete.

  • TRANSACTION_NOTIFY_INDOUBT

    KTM n’a pas déterminé l’état de la transaction et enverra ultérieurement une notification de validation ou de restauration.

En règle générale, KTM envoie une notification TRANSACTION_NOTIFY_COMMIT si elle détermine que tous les gestionnaires de ressources appelés ZwPrepareComplete avant l’arrêt et le redémarrage du TPS. KTM envoie une notification TRANSACTION_NOTIFY_ROLLBACK si elle détermine qu’un ou plusieurs gestionnaires de ressources n’ont pas appelé ZwPrepareComplete.

Une fois que KTM a envoyé une notification TRANSACTION_NOTIFY_RECOVER pour chaque inscription, elle envoie une notification TRANSACTION_NOTIFY_LAST_RECOVER.

Si votre gestionnaire de ressources a appelé ZwRollforwardTransactionManager au lieu de ZwRecoverTransactionManager, il doit récupérer uniquement jusqu’à la valeur d’horloge virtuelle qu’il a spécifiée à ZwRollforwardTransactionManager.

Les gestionnaires de ressources peuvent appeler ZwSetInformationEnlistment pour définir des informations de récupération personnalisées. KTM enregistre ces informations et les écrit dans le flux de journal, mais KTM n’essaie pas d’interpréter les informations. Le gestionnaire de ressources peut récupérer les informations de récupération à tout moment en appelant ZwQueryInformationEnlistment.

Les gestionnaires de transactions supérieurs reçoivent parfois des notifications TRANSACTION_NOTIFY_RECOVER_QUERY pendant une opération de récupération.