Étape 2 : extension d’une transaction à travers les composants
Objectifs
Au cours de cette étape, vous allez découvrir les éléments suivants :
- Workflow de transaction
- Vote de plusieurs objets dans une transaction
Description
étape 1 : la création d’un composant transactionnel montre comment écrire un composant transactionnel simple qui met à jour les informations sur l’auteur dans la base de données Pubs Microsoft SQL Server. L’étape 2 montre ce qui se passe lorsqu’une transaction est étendue sur plusieurs composants.
En conservant le 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 retourne 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. Dans cette étape, sa valeur d’attribut de transaction est définie sur pris en charge, comme indiqué dans l’illustration suivante, qui étend la transaction existante au nouvel objet.

La valeur d’attribut prise en charge étend (ou transmet) 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 ensuite les attributs de service qui sont définis sur ValidateAuthorAddress et attribue au nouvel objet le même identificateur de transaction affecté à l’objet appelant. Pour mieux comprendre ce processus, consultez activation du contexte.
Étant donné qu’ils partagent le même identificateur de transaction, les deux objets doivent effectuer leur travail avec succès ou COM+ abandonne la transaction (annulation des modifications apportées à la base de données pubs).
Tous les objets participant à une transaction votent pour valider ou abandonner la transaction. Le vote se produit explicitement lorsque vous incluez des instructions de vote dans votre code, comme le montre l’extraction suivante à partir de l’exemple de code Step 1, qui crée le UpdateAuthorAddress composant :
' Everything works.
contextstate.SetMyTransactionVote TxCommit
contextstate.SetDeactivateOnReturn True
Exit Sub
UnexpectedError:
' There's an error.
contextstate.SetMyTransactionVote TxAbort
contextstate.SetDeactivateOnReturn True
Le vote se produit également implicitement, comme c’est le cas dans le ValidateAuthorAddress composant. À moins que l’objet ne déclare autrement, COM+ suppose qu’un objet a terminé son travail, mais qu’il n’est pas prêt à être désactivé. COM+ effectue l’hypothèse suivante :
contextstate.SetMyTransactionVote TxCommit
contextstate.SetDeactivateOnReturn False
Lorsque ValidateAuthorAddress retourne à son appelant, com+ lit son vote comme une validation. COM+ ne compte pas les votes tant qu’il n’a pas désactivé l’objet racine, qui est le premier objet dans la transaction dans le cas présent, l' UpdateAuthorAddress objet.
Exemple de code
Le ValidateAuthorAddress composant effectue une vérification simple de l’adresse de l’auteur. Étant donné que 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é
La définition de l’attribut de transaction d’un composant sur pris en charge 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 l’état transactionnel du nouvel objet. Si l’appelant est transactionnel, COM+ transmet la transaction au nouvel objet.
Tous les objets qui participent à la même transaction partagent un identificateur de transaction commun, que COM+ lit à partir du contexte de l’objet.
Chaque objet dans une transaction est vote indépendamment des autres objets. COM+ compte les votes lorsque l’objet racine est désactivé.
Vous pouvez 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 et produisent des résultats de vote similaires, comme indiqué dans le tableau suivant. Vous pouvez utiliser l’une ou l’autre des interfaces pour voter de manière explicite dans une transaction.
Méthodes de combinaison IContextState Méthode équivalente IObjectContext SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = trueSetComplete SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = falseEnableCommit SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = trueSetAbort SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = falseDisableCommit COM+ définit le vote d’un objet sur l’équivalent de EnableCommit , sauf si le composant vote explicitement.
Le vote de manière explicite peut réduire la durée globale de la transaction et libérer des verrous de ressource coûteux.