Partager via


Étape 2 : Extension d'une transaction à plusieurs composants

Objectifs

Dans cette étape, vous apprendrez ce qui suit :

  • Le flux de la transaction
  • Comment plusieurs objets votent dans une transaction

Description

Étape 1 : Création d'un composant transactionnel montre comment écrire un composant transactionnel simple qui met à jour les informations sur les auteurs dans la base de données Pubs de Microsoft SQL Server. L'étape 2 montre ce qui se passe lorsqu'une transaction est étendue à plusieurs composants.

Conformément au modèle de programmation COM+, UpdateAuthorAddress appelle un autre composant au cours de l'exécution de son travail. Le deuxième composant, ValidateAuthorAddress, valide l'adresse de l'auteur et renvoie les résultats à son appelant, UpdateAuthorAddress.

Contrairement à son appelant, ValidateAuthorAddress ne nécessite pas de transaction, mais il peut toujours participer à la transaction de son appelant. Au cours de cette étape, la valeur de son attribut de transaction est fixée à Soutenu, comme le montre l'illustration suivante, ce qui étend la transaction existante au nouvel objet.

Le diagramme qui montre l'extension de la transaction existante au nouvel objet.

La valeur de l'attribut Supporté prolonge (ou écoule) une transaction existante uniquement lorsque l'appelant est transactionnel. Lorsque UpdateAuthorAddress appelle ValidateAuthorAddress, COM+ examine d'abord le contexte de l'appelant pour voir s'il est transactionnel. COM+ examine alors les attributs de service définis sur ValidateAuthorAddress et attribue au nouvel objet le même identifiant de transaction que celui attribué à l'objet appelant. Pour mieux comprendre ce processus, voir Activation du contexte.

Parce qu'ils partagent le même identifiant de transaction, les deux objets doivent terminer leur travail avec succès ou COM+ annule la transaction (annulant toutes les modifications apportées à la base de données Pubs).

Tous les objets participant à une transaction votent pour valider ou annuler la transaction. Le vote a lieu explicitement lorsque vous incluez des instructions de vote dans votre code, comme le montre l'extrait suivant de l'exemple de code de l'étape 1, qui crée le composant UpdateAuthorAddress :

  ' Everything works.
  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn True
  Exit Sub
  
UnexpectedError:
  ' There's an error.
  contextstate.SetMyTransactionVote TxAbort
  contextstate.SetDeactivateOnReturn True

Le vote peut également être implicite, comme c'est le cas dans le composant ValidateAuthorAddress. Sauf déclaration contraire de l'objet, COM+ suppose qu'un objet a terminé son travail avec succès mais qu'il n'est pas prêt à être désactivé. COM+ part de l'hypothèse suivante :

  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn False

Lorsque ValidateAuthorAddress retourne à son appelant, COM+ lit son vote comme un engagement. COM+ ne compte pas les votes tant qu'il n'a pas désactivé l'objet racine, qui est le premier objet de la transaction - dans ce cas, l'objet UpdateAuthorAddress

Exemple de code

Le composant ValidateAuthorAddress vérifie simplement l'adresse de l'auteur. Comme UpdateAuthorAddress ne vote pas explicitement, COM+ utilise les paramètres de vote par défaut.

Option Explicit
'
'   Purpose:   This class is used for validating an author's address
'              (presumably right before updating that address in the
'              database).
'
'   Notes:   This component could be in a transaction or not; it doesn't 
'            matter because it doesn't touch any data in a database.
'
Public Function ValidateAuthorAddress( _
                        ByVal strAddress As String, _
                        ByVal strCity As String, _
                        ByVal strState As String, _
                        ByVal strZip As String) As Boolean
  ' Default is to validate unless something is found to be wrong.
  ValidateAuthorAddress = True
                                                  
  '  Invalidate authors who live in New York City
  '  and authors who live in Montana.
  '
  If strCity = "New York" And strState = "New York" Then
    ValidateAuthorAddress = False
  ElseIf strState = "Montana" Then
    ValidateAuthorAddress = False
  End If
  ' Done
End Function

Résumé

  • Le fait de définir l'attribut de transaction d'un composant sur Soutenu peut entraîner la création du nouvel objet dans la transaction de l'objet appelant. COM+ examine le contexte de l'appelant pour déterminer le statut transactionnel du nouvel objet. Si l'appelant est transactionnel, COM+ transfère la transaction au nouvel objet.

  • Tous les objets participant à la même transaction partagent un identifiant de transaction commun, que COM+ lit dans le contexte de l'objet.

  • Chaque objet d'une transaction vote indépendamment des autres objets. COM+ compte les votes lorsque l'objet racine est désactivé.

  • Vous pouvez faire basculer le vote de transaction d'un objet entre commit et abort jusqu'à ce que COM+ désactive l'objet ou jusqu'à ce que COM+ désactive l'objet racine et mette fin à la transaction. Seul le dernier paramètre de vote compte. Les interfaces IContextState et IObjectContext fournissent des méthodes qui produisent des résultats de vote similaires, comme le montre le tableau suivant. Vous pouvez utiliser l'une ou l'autre interface pour voter explicitement dans une transaction.

    Méthodes de combinaison de IContextState Méthode équivalente à IObjectContext
    SetMyTransactionVote txVote = TxCommit
    SetDeactivateOnReturn bDeactivate = True
    SetComplete
    SetMyTransactionVote txVote = TxCommit
    SetDeactivateOnReturn bDeactivate = False
    EnableCommit
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturn bDeactivate = True
    SetAbort
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturn bDeactivate = False
    DisableCommit
  • COM+ fixe le vote d'un objet à l'équivalent de EnableCommit, à moins que le composant ne vote explicitement.

  • Le vote explicite peut réduire la durée totale de la transaction et libérer des verrous de ressources coûteux.

Étape 1 : Création d'un composant transactionnel

Étape 3 : Réutilisation des composants

Activation du contexte

Gestion des transactions automatiques dans COM+