Beschleunigen von Transaktionen durch Benachrichtigen des Stammobjekts

Um automatische Transaktionen effektiv zu verwenden, sollte jede Transaktionskomponente angeben, dass sie ihre Arbeit abgeschlossen hat. Wenn eine Objektinstanz ihre Aufgabe erfolgreich abgeschlossen hat, sollte sie ihre konsistenten und fertig-Flags durch Aufrufen der IObjectContext::SetComplete-Methode auf True festlegen. 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. Wenn Sie explizit angeben, dass ein Stammobjekt seine Arbeit abgeschlossen hat, können Sie die Länge der Transaktion reduzieren.

Wenn bei einer transaktionalen Objektmethode ein Fehler auftritt, sollte das Objekt sein konsistentes Flag auf False und das fertige Flag auf True festlegen, indem die IObjectContext::SetAbort-Methode aufgerufen wird. Durch Aufrufen der SetAbort-Methode gibt ein Objekt das Steuerelement 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, obwohl nichts sie vor dem letztendlichen Abbruch speichern kann. Um die Beendigung einer fehlgeschlagenen Transaktion zu beschleunigen, können Sie einen Fehler erstellen, um das Stammobjekt darüber zu warnen, dass es auch SetAbort aufruft. Zur Vervollständigung sollte das Stammobjekt dann eine Fehlermeldung an seinen Client senden.

Es gibt viele verschiedene Ansätze, die Sie zum Behandeln von Fehlern verwenden können, aber Ihr Ansatz sollte die Kommunikation zwischen inneren Objekten und dem Stammobjekt eindeutig koordinieren.

Die folgenden Visual Basic Codefragmente zeigen einen Ansatz für die Fehlerbehandlung. Im ersten Fragment ruft ein inneres Objekt SetAbortauf, 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 Nachricht wie folgt an seinen 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+