Utilisation des valeurs d’horloge virtuelle

KTM fournit une horloge virtuelle pour chaque objet de gestionnaire de transactions. Lorsqu’un gestionnaire de ressources appelle ZwCreateTransactionManager, KTM définit la valeur d’horloge virtuelle de l’objet sur 1. KTM incrémente la valeur de l’horloge virtuelle chaque fois qu’une opération de validation commence. Chaque fois que KTM écrit dans son flux de journal, il inclut la valeur d’horloge virtuelle actuelle dans l’enregistrement du journal.

Lorsqu’un gestionnaire de ressources appelle ZwRecoverTransactionManager, KTM lit les enregistrements de flux de journaux jusqu’à la fin du flux et définit la valeur d’horloge virtuelle de l’objet gestionnaire de transactions sur la dernière valeur qu’il trouve dans le flux de journal de l’objet.

Lorsqu’un gestionnaire de ressources appelle ZwRollforwardTransactionManager, KTM lit les enregistrements de flux de journal jusqu’à la valeur d’horloge spécifiée et définit la valeur d’horloge virtuelle de l’objet gestionnaire de transactions sur la valeur d’horloge spécifiée.

KTM permet aux gestionnaires de ressources et aux gestionnaires de transactions supérieurs de modifier la valeur d’horloge virtuelle d’un objet de gestionnaire de transactions, mais ils n’ont généralement pas besoin de modifier la valeur d’horloge.

Quand modifier les valeurs de l’horloge virtuelle

En règle générale, votre système de traitement transactionnel (TPS) n’a pas besoin de modifier les valeurs d’horloge virtuelle, sauf si les composants de votre tps tentent de synchroniser plusieurs flux de journaux.

Par exemple, supposons que votre TPS contienne plusieurs gestionnaires de ressources qui communiquent entre eux pendant les séquences de pré-préparation/préparation/validation. Supposons également que chaque gestionnaire de ressources crée un objet de gestionnaire de transactions qui a un flux de journal unique. Pour vous assurer que KTM restaure l’état de tous les gestionnaires de ressources au même point dans le temps pendant une opération de récupération, ces gestionnaires de ressources peuvent utiliser les étapes suivantes :

  • Lorsqu’un gestionnaire de ressources communique avec un autre, il transmet la valeur d’horloge virtuelle la plus récente qu’il a reçue de KTM ou d’un autre gestionnaire de ressources.

  • Chaque fois qu’un gestionnaire de ressources appelle une routine KTM qui accepte une valeur d’horloge virtuelle (voir la section suivante de cette rubrique), il transmet la valeur d’horloge la plus élevée qu’il a reçue de KTM ou d’un autre gestionnaire de ressources.

  • Chaque gestionnaire de ressources écrit des valeurs d’horloge virtuelle dans son flux de journaux et les utilise lorsqu’il effectue des opérations de restauration ou de récupération.

Grâce à ces étapes, les valeurs d’horloge virtuelle que KTM stocke pour chaque objet de gestionnaire de transactions correspondent presque ou exactement. Par conséquent, lorsqu’une opération de récupération amène KTM à lire ses flux de journaux, ou lorsqu’une opération de restauration amène les gestionnaires de ressources à lire leurs flux de journaux, la récupération ou la restauration sont basées sur des flux de journaux synchronisés.

Comment modifier les valeurs d’horloge virtuelle

Les gestionnaires de ressources peuvent modifier la valeur de l’horloge virtuelle en passant une nouvelle valeur à ZwPrePrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment ou ZwSinglePhaseReject.

Les gestionnaires de transactions supérieurs peuvent modifier la valeur de l’horloge virtuelle en transmettant une nouvelle valeur à ZwPrePrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment ou ZwReadOnlyEnlistment.

En outre, un gestionnaire de ressources ou un gestionnaire de transactions supérieur qui utilise une routine de rappel ResourceManagerNotification peut modifier la valeur d’horloge virtuelle que la routine de rappel reçoit. KTM enregistre ensuite la valeur mise à jour.

Si un gestionnaire de ressources ou un gestionnaire de transactions supérieur transmet une nouvelle valeur d’horloge à KTM, KTM enregistre la nouvelle valeur uniquement si elle est supérieure à la valeur d’horloge actuelle. Sinon, KTM conserve la valeur d’horloge actuelle.

Les gestionnaires de ressources et les gestionnaires de transactions supérieurs peuvent obtenir la valeur d’horloge virtuelle d’un objet de gestionnaire de transactions en appelant la routine ZwQueryInformationTransactionManager .