Beschleunigen von Transaktionen durch Benachrichtigen des Stammobjekts

Um automatische Transaktionen effektiv zu verwenden, sollte jede Transaktionskomponente angeben, dass sie ihre Arbeit abgeschlossen hat. Wenn ein Objekt instance seine Aufgabe erfolgreich abgeschlossen hat, sollte es seine konsistenten und done-Flags auf True festlegen, indem die IObjectContext::SetComplete-Methode aufgerufen wird. Wenn alle inneren Objekte der Transaktion SetComplete aufgerufen haben, kann die Transaktion beendet werden, indem das Stammobjekt durch Aufrufen der SetComplete-Methode explizit deaktiviert wird. Indem Sie explizit angeben, dass ein Stammobjekt seine Arbeit abgeschlossen hat, können Sie die Länge der Transaktion verringern.

Wenn eine Transaktionalobjektmethode fehlschlägt, sollte das Objekt sein konsistentes Flag auf False und sein done-Flag auf True festlegen, indem die IObjectContext::SetAbort-Methode aufgerufen wird. Durch Aufrufen der SetAbort-Methode gibt ein Objekt die Steuerung an seinen Aufrufer zurück und stellt sicher, dass die Transaktion letztendlich abgebrochen wird.

Es sei denn, das Objekt, das SetAbort aufruft, ist der Stamm der Transaktion, die Transaktion wird weiterhin ausgeführt, auch wenn nichts sie vor dem Abbruch speichern kann. Um die Beendigung einer fehlgeschlagenen Transaktion zu beschleunigen, können Sie einen Fehler auslösen, um das Stammobjekt zu benachrichtigen, auch SetAbort aufzurufen. Zur Vervollständigung sollte das Stammobjekt dann eine Fehlermeldung an den Client senden.

Obwohl es viele verschiedene Ansätze gibt, die Sie verwenden können, um Fehler zu behandeln, sollte Ihr Ansatz die Kommunikation zwischen inneren Objekten und dem Stammobjekt klar koordinieren.

Die folgenden Visual Basic-Codefragmente zeigen einen Ansatz zur Fehlerbehandlung. Im ersten Fragment ruft ein internes Objekt SetAbort auf, löst einen Fehler aus und generiert wie folgt eine Fehlermeldung:

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

Im zweiten Fragment behandelt das Stammobjekt den Fehler und übergibt die Meldung wie folgt an den Client:

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

Verwalten automatischer Transaktionen in COM+