Freigeben über


Schritt 2: Erweitern einer Transaktion über mehrere Komponenten hinweg

Ziele

In diesem Schritt werden Sie Folgendes lernen:

  • Transaktions-Flow
  • So stimmen mehrere Objekte in einer Transaktion ab

Beschreibung

Schritt 1: Erstellen einer Transaktionskomponente zeigt, wie Sie eine einfache Transaktionskomponente erstellen, die Autoreninformationen in der Microsoft SQL Server Pubs-Datenbank aktualisiert. Schritt 2 zeigt, was passiert, wenn eine Transaktion auf mehrere Komponenten ausgedehnt wird.

In Übereinstimmung mit dem COM+ Programmiermodell ruft UpdateAuthorAddress eine andere Komponente auf, während sie ihre Arbeit verrichtet. Die zweite Komponente, ValidateAuthorAddress, überprüft die Adresse des Autors und gibt die Ergebnisse an ihren Aufrufer, UpdateAuthorAddress, zurück.

Im Gegensatz zu seinem Aufrufer benötigt ValidateAuthorAddress keine Transaktion, kann aber dennoch an der Transaktion seines Aufrufers teilnehmen. In diesem Schritt wird der Wert seines Transaktionsattributs auf Supported festgelegt, wie in der folgenden Abbildung gezeigt, wodurch die bestehende Transaktion auf das neue Objekt erweitert wird.

Diagramm, das die Erweiterung der bestehenden Transaktion auf das neue Objekt zeigt.

Der Attributwert Supported erweitert eine bestehende Transaktion nur, wenn der Aufrufer transaktional ist. Wenn UpdateAuthorAddress ValidateAuthorAddress aufruft, prüft COM+ zunächst den Kontext des Aufrufers, um festzustellen, ob er transaktional ist. COM+ prüft dann die Dienstattribute, die für ValidateAuthorAddress festgelegt sind, und weist dem neuen Objekt die gleiche Transaktionskennung zu, die auch dem Objekt des Aufrufers zugewiesen ist. Um diesen Prozess besser zu verstehen, lesen Sie Kontextaktivierung.

Da sie dieselbe Transaktionskennung haben, müssen beide Objekte ihre Arbeit erfolgreich abschließen, sonst bricht COM+ die Transaktion ab (und macht damit alle Änderungen an der Pubs-Datenbank rückgängig).

Alle an einer Transaktion beteiligten Objekte stimmen darüber ab, ob die Transaktion bestätigt oder abgebrochen werden soll. Die Abstimmung erfolgt explizit, wenn Sie Anweisungen zur Abstimmung in Ihren Code einfügen, wie der folgende Auszug aus dem Beispielcode von Schritt 1 zeigt, mit dem die Komponente UpdateAuthorAddress erstellt wird:

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

Die Abstimmung erfolgt ebenfalls implizit, genau wie in der Komponente ValidateAuthorAddress. Sofern das Objekt nichts anderes deklariert, geht COM+ davon aus, dass ein Objekt seine Arbeit erfolgreich abgeschlossen hat, aber nicht bereit ist, deaktiviert zu werden. COM+ geht von der folgenden Annahme aus:

  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn False

Wenn ValidateAuthorAddress zu seinem Aufrufer zurückkehrt, liest COM+ seine Stimme als Commit. COM+ zählt die Stimmen erst, wenn es das Root-Objekt deaktiviert, das in diesem Fall das erste Objekt in der Transaktion ist, das UpdateAuthorAddress-Objekt.

Beispielcode

Die ValidateAuthorAddress-Komponente führt eine einfache Überprüfung der Adresse des Autors durch. Da UpdateAuthorAddress nicht explizit abstimmt, verwendet COM+ die Standardeinstellungen für die Abstimmung.

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

Zusammenfassung

  • Das Festlegen des Transaktionsattributs einer Komponente auf Supported kann dazu führen, dass das neue Objekt in der Transaktion des aufrufenden Objekts erstellt wird. COM+ prüft den Kontext des Aufrufers, um den Transaktionsstatus des neuen Objekts zu bestimmen. Wenn der Aufrufer transaktional ist, leitet COM+ die Transaktion an das neue Objekt weiter.

  • Alle Objekte, die an der gleichen Transaktion teilnehmen, haben eine allgemeine Transaktionskennung, die COM+ aus dem Kontext des Objekts liest.

  • Jedes Objekt in einer Transaktion stimmt unabhängig von anderen Objekten ab. COM+ zählt die Stimmen, wenn das Root-Objekt deaktiviert wird.

  • Sie können die Transaktionsabstimmung eines Objekts zwischen Commit und Abort hin- und herschalten, bis COM+ das Objekt deaktiviert oder bis COM+ das Root-Objekt deaktiviert und die Transaktion beendet. Es zählt nur die letzte Vote-Einstellung. Die Schnittstellen IContextState und IObjectContext stellen Methoden zur Verfügung, die ähnliche Abstimmungsergebnisse liefern, wie in der folgenden Tabelle dargestellt. Sie können beide Schnittstellen verwenden, um in einer Transaktion explizit abzustimmen.

    IContextState combination methods IObjectContext equivalent method
    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+ legt die Abstimmung eines Objekts auf das Äquivalent von EnableCommit fest, es sei denn, die Komponente stimmt explizit ab.

  • Die explizite Stimmabgabe kann die Gesamtdauer der Transaktion verkürzen und teure Ressourcensperren freigeben.

Schritt 1: Erstellen einer transaktionalen Komponente

Schritt 3: Wiederverwendung von Komponenten

Kontext-Aktivierung

Verwaltung automatischer Transaktionen in COM+