Partager via


Vitesse des transactions en notification de l’objet racine

Pour utiliser efficacement les transactions automatiques, chaque composant transactionnel doit indiquer qu’il a terminé son travail. Lorsqu’une instance d’objet termine correctement sa tâche, elle doit définir ses indicateurs cohérents et terminés sur True en appelant la méthode IObjectContext::SetComplete . Lorsque tous les objets intérieurs de la transaction ont appelé SetComplete, la transaction peut être arrêtée en désactivant explicitement l’objet racine en appelant sa méthode SetComplete . En indiquant explicitement qu’un objet racine a terminé son travail, vous pouvez réduire la longueur de la transaction.

Lorsqu’une méthode d’objet transactionnel échoue, l’objet doit définir son indicateur cohérent sur False et son indicateur terminé sur True en appelant la méthode IObjectContext::SetAbort . En appelant la méthode SetAbort , un objet retourne le contrôle à son appelant et garantit que la transaction est finalement abandonnée.

Toutefois, sauf si l’objet appelant SetAbort est la racine de la transaction, la transaction continue à s’exécuter même si rien ne peut l’enregistrer à partir de l’abandon. Pour accélérer l’arrêt d’une transaction ayant échoué, vous pouvez déclencher une erreur pour avertir l’objet racine d’appeler également SetAbort. Pour terminer, l’objet racine doit ensuite envoyer un message d’erreur à son client.

Bien qu’il existe de nombreuses approches différentes que vous pouvez prendre pour gérer les erreurs, votre approche doit coordonner clairement les communications entre les objets intérieurs et l’objet racine.

Les fragments de code Visual Basic suivants illustrent une approche de la gestion des erreurs. Dans le premier fragment, un objet intérieur appelle SetAbort, génère une erreur et génère un message d’erreur, comme suit :

Dim ObjCtx As ObjectContext
Dim ErrorCode As Long, Description As String

Set ObjCtx = GetObjectContext()
ObjCtx.SetAbort
ErrorCode = vbObjectError + 5
Description = "Some meaningful message"
Err.Raise ErrorCode, , Description

Dans le deuxième fragment, l’objet racine gère l’erreur et transmet le message à son client, comme suit :

Sub MyObjMethod1()
  On Error GoTo MyObjMethod1_err
  Dim ObjCtx As ObjectContext
  Dim InteriorObj1 As Cinterior  ' Cinterior is a user-defined object.

  Set ObjCtx = GetObjectContext()
  Set InteriorObj1 = CreateObject ("MyDll.Cinterior")
  InteriorObj1.Method1
  ' If the call completed successfully, then...
  ObjCtx.SetComplete
Exit Sub
  MyObjMethod1_err:
  ' Doom the transaction and exit.
  ObjCtx.SetAbort
  ' Pass the message back to client.
  Err.Raise Err.Number, , Err.Description
End Sub

Gestion des transactions automatiques dans COM+