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.
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 = TrueSetComplete SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = FalseEnableCommit SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = TrueSetAbort SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = FalseDisableCommit 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.