ASP-Vorlesungsreihe (21) Erstellen von Transaktionsskripten
Autor:Eve Cole
Aktualisierungszeit:2009-05-30 19:58:32
Geschäftsanwendungen erfordern häufig die Möglichkeit, Skripte und Komponenten innerhalb von Transaktionen auszuführen. Eine Transaktion ist ein Servervorgang. Auch wenn der Vorgang viele Schritte umfasst (z. B. Bestellen, Überprüfen des Lagerbestands, Bezahlen von Rechnungen usw.), kann er nur den Gesamterfolg oder Misserfolg des Vorgangs zurückgeben. Benutzer können ASP-Skripte erstellen, die innerhalb einer Transaktion ausgeführt werden. Wenn ein Teil des Skripts fehlschlägt, wird die gesamte Transaktion beendet.
Die ASP-Transaktionsverarbeitung basiert auf Microsoft Transaction Server (MTS). Microsoft Transaction Server (MTS) ist ein Transaktionsverarbeitungssystem zum Entwickeln, Konfigurieren und Verwalten leistungsstarker, skalierbarer und robuster Internet- und Intranet-Serveranwendungen für Unternehmen. Transaction Server bietet ein Anwendungsdesignmodell für die Entwicklung verteilter, komponentenbasierter Anwendungen. Es bietet außerdem eine Laufzeitumgebung zum Konfigurieren und Verwalten dieser Anwendungen.
Die Möglichkeit, Transaktionsskripts zu erstellen, ist in Internet Information Server und Personal Web Server integriert. Wenn Sie Microsoft Transaction Server installiert haben, können Sie Komponenten so verpacken, dass sie innerhalb einer Transaktion ausgeführt werden.
Über Transaktionen Eine Transaktion ist der Gesamterfolg oder Misserfolg einer Operation. Die Transaktionsverarbeitung dient der zuverlässigen Aktualisierung der Datenbank. Wenn Sie viele zusammenhängende Änderungen an einer Datenbank vornehmen oder mehrere Datenbanken gleichzeitig aktualisieren, stellen Sie sicher, dass alle Änderungen korrekt ausgeführt werden. Wenn eine dieser Änderungen fehlschlägt, muss der ursprüngliche Zustand der Datenbanktabellen wiederhergestellt werden.
Ohne MTS müssten Sie Skripte und Komponenten schreiben, um angeforderte Änderungen manuell zu verfolgen und die Daten wiederherzustellen, wenn einige Änderungen fehlschlagen. Mit MTS deklarieren Sie einfach Ihre Skripte und Komponenten als „Transaktionen erfordern“ und überlassen MTS die Transaktionskonsistenz. Die Transaktionsverarbeitung betrifft nur den Datenbankzugriff; Änderungen am Dateisystem oder anderen nicht transaktionalen Ressourcen kann MTS nicht wiederherstellen. Die Datenbank, auf die die Anwendung zugreift, muss von MTS unterstützt werden. Derzeit unterstützt MTS SQL Server und jeden Server, der das XA-Protokoll unterstützt (spezifiziert durch die X/Open Association). MTS wird die Unterstützung für andere Datenbanken weiter ausbauen.
Transaktionen können nicht mehrere ASP-Seiten umfassen. Wenn für eine Transaktion Objekte aus mehreren Komponenten erforderlich sind, müssen die Vorgänge, die diese Objekte verwenden, in einer ASP-Seite zusammengefasst werden. Angenommen, Sie verfügen über eine Komponente, die eine Gehaltsabrechnungsdatenbank aktualisiert, und eine Komponente, die Mitarbeiterdatensätze in einer Personaldatenbank aktualisiert. Um neue Gehaltsinformationen für einen Mitarbeiter aufzuzeichnen, müssen Sie ein Skript schreiben, das diese beiden Komponenten in einem Transaktionskontext aufruft, eine zum Aktualisieren der Gehaltsdatenbank und die andere zum Aktualisieren der Mitarbeiterstufe in der Personaldatenbank.
Transaktionale Skripts deklarieren Wenn Sie eine Seite als transaktional deklarieren, werden alle Skriptbefehle und Objekte auf der Seite in derselben Transaktionsumgebung ausgeführt. Der Transaktionsserver verwaltet die Details der Generierung von Transaktionen und bestimmt, ob die Transaktion erfolgreich ist (festgeschrieben) oder fehlschlägt (beendet). Um eine Seite als transaktional zu deklarieren, fügen Sie oben auf der Seite die @TRANSACTION-Direktive hinzu:
<%@ TRANSACTION = Wert %>
Der Wertparameter kann einer der folgenden sein:
Wertbedeutung
Requires_New startet eine neue Transaktion.
Erforderlich startet eine neue Transaktion.
Unterstützt startet keine Transaktion.
Not_Supported Startet die Transaktion nicht.
Die @TRANSACTION-Direktive muss in der ersten Zeile einer Seite stehen, andernfalls wird ein Fehler generiert. Diese Anweisung muss jeder Seite hinzugefügt werden, die im Rahmen einer Transaktion ausgeführt werden muss. Wenn die Skriptverarbeitung endet, endet die aktuelle Transaktion.
Die meisten Anwendungen erfordern nur für bestimmte Vorgänge eine Transaktionsumgebung. Beispielsweise sind für die Website einer Fluggesellschaft möglicherweise nur Transaktionsskripte erforderlich, um die Ticketausstellung und die Sitzplatzvereinbarung zu verwalten, während alle anderen Skripte ohne eine Transaktionsumgebung sicher ausgeführt werden können. Da Transaktionen nur für Seiten verwendet werden müssen, die eine Transaktionsverarbeitung erfordern, deklarieren Sie die Global.asa-Datei Ihrer Anwendung nicht als transaktional.
Wenn eine Transaktion abgebrochen wird, macht Transaction Server alle Änderungen an transaktionsgestützten Ressourcen rückgängig. Derzeit unterstützen nur Datenbankserver Transaktionen vollständig, da die Daten in der Datenbank für Unternehmensanwendungen am kritischsten sind. Transaction Server stellt keine Änderungen an Dateien, Sitzungs- und Anwendungsvariablen, Sammlungen usw. auf der Festplatte wieder her. Sie können jedoch die Wiederherstellung von Variablen und Sammlungen per Skript durchführen, indem Sie Transaktionsereignisse schreiben, wie im folgenden Thema beschrieben. Zu bestimmten Zeiten kann Ihr Skript eine Transaktion auch explizit festschreiben oder beenden, beispielsweise wenn das Schreiben von Daten in eine Datei fehlschlägt.
Skripts festschreiben oder beenden Da Transaction Server die Transaktionsverarbeitung verfolgt, bestimmt er, ob die Transaktion vollständig erfolgreich war oder fehlgeschlagen ist. Ein Skript kann eine Transaktion explizit beenden, indem es ObjectContext.SetAbort aufruft. Beispielsweise muss ein Skript eine Transaktion beenden, wenn es eine Fehlermeldung von einer Komponente empfängt, gegen Geschäftsspezifikationen verstößt (z. B. wenn ein Kontostand kleiner als 0 ist) oder bei nicht transaktionalen Vorgängen wie dem Lesen und Schreiben von Dateien fehlschlägt. Wenn die Seite vor Abschluss der Transaktion abläuft, muss die Transaktion ebenfalls beendet werden.
Das Schreiben von Transaktionsereignisskripten allein bestimmt nicht, ob eine Transaktion erfolgreich ist oder fehlschlägt. Sie können jedoch Ereignisse schreiben, die aufgerufen werden, wenn eine Transaktion festgeschrieben oder beendet wird. Wenn Sie beispielsweise über ein Skript verfügen, das ein Bankkonto bestätigt, und Sie für unterschiedliche Status der Transaktion unterschiedliche Seiten an den Benutzer zurückgeben müssen, können Sie die Ereignisse OnTransactionCommit und OnTransactionAbort verwenden, um unterschiedliche Antworten an den Benutzer zu schreiben.
<%@ TRANSACTION = Erforderlich %>
<%
'Ausgabe puffern, damit verschiedene Seiten angezeigt werden können.
Response.Buffer = True
%>
<HTML>
<KÖRPER>
<H1>Willkommen beim Online-Banking-Service</H1>
<%
Setze BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>Vielen Dank. Ihre Transaktion wird bearbeitet.</P>
</BODY>
</HTML>
<%
' Diese Seite anzeigen, wenn die Transaktion erfolgreich ist.
SubOnTransactionCommit()
Response.Write „<HTML>“
Response.Write „<BODY>“
Antwort: Schreiben Sie „Vielen Dank. Ihr Konto wurde gutgeschrieben.“
Response.Write „</BODY>“
Response.Write „</HTML>“
Response.Flush()
Ende sub
%>
<%
' Diese Seite anzeigen, wenn die Transaktion fehlschlägt.
SubOnTransactionAbort()
Response.Clear()
Response.Write „<HTML>“
Response.Write „<BODY>“
Response.Write „Wir können Ihre Transaktion nicht abschließen.“
Response.Write „</BODY>“
Response.Write „</HTML>“
Response.Flush()
Sub beenden
%>
Registrieren einer Komponente im MTS-Ressourcenmanager Um an einer Transaktion teilnehmen zu können, muss die Komponente im MTS-Paket registriert und so konfiguriert sein, dass Transaktionen erforderlich sind. Wenn Ihr Skript beispielsweise Bestellungen verarbeitet, indem es zwei Komponenten aufruft, aktualisiert eine die Bestandsdatenbank und die andere die Zahlungsdatenbank. Dann müssen diese beiden Komponenten in derselben Transaktionsumgebung ausgeführt werden. Der Transaktionsserver garantiert, dass bei einem Ausfall einer Komponente keine Datenbank aktualisiert wird. Für einige Komponenten sind keine Transaktionen erforderlich; beispielsweise die Ad Rotator-Komponente.
Registrieren und konfigurieren Sie Transaktionskomponenten mit MTS Resource Manager. Die Eigenschaften der Transaktion müssen auf „Transaktion erforderlich“ oder „Neue Transaktion erforderlich“ festgelegt sein. Transaktionskomponenten müssen im MTS-Paket registriert werden. Anstatt Komponenten in IIS-In-Process-Paketen zu platzieren, erstellen Sie Ihre eigenen Pakete. Normalerweise sollten alle Komponenten in einer Komponentenbibliothek abgelegt werden. Die Komponenten der Komponentenbibliothek können von mehreren ASP-Anwendungen genutzt und im ASP-Anwendungsprozess ausgeführt werden. Erstellen Sie mit MTS Explorer ein neues Paket und setzen Sie die Aktivierungseigenschaft des Pakets auf Bibliothek.
Transaktionskomponenten können auch im Serverpaket registriert werden. Serverpakete werden normalerweise als separater Prozess auf dem Server ausgeführt. Wenn Sie eine funktionsgruppenbasierte Sicherheitsüberprüfung verwenden möchten oder Ihre Komponenten für Anwendungen auf Remotecomputern zugänglich sein sollen, verwenden Sie das Serverpaket für Transaktionskomponenten.
Um MTS Explorer verwenden zu können, muss Microsoft Transaction Server installiert sein.
Objektumfang Im Allgemeinen sollten aus MTS-Komponenten erstellte Objekte nicht in ASP-Anwendungs- oder Sitzungsobjekten gespeichert werden. MTS-Objekte verschwinden, nachdem die Transaktion abgeschlossen ist. Da das Sitzungsobjekt und das Anwendungsobjekt für Objektinstanzen konzipiert sind, die zwischen verschiedenen ASP-Seiten verwendet werden, sollten Sie sie nicht zum Speichern von Objekten verwenden, die am Ende einer Transaktion freigegeben werden.
Das ASP-Skript ist die Wurzel der deklarierten Transaktion, der Ausgangspunkt. Jedes von einer transaktionalen ASP-Seite verwendete MTS-Objekt wird als Teil der Transaktion betrachtet. Wenn die Transaktion abgeschlossen ist, verschwinden die auf der Seite verwendeten MTS-Objekte, einschließlich der im Sitzungs- oder Anwendungsobjekt gespeicherten Objekte. Ab diesem Zeitpunkt schlägt jeder Versuch fehl, ein sitzungs- oder anwendungsbezogenes Objekt von einer anderen Transaktionsseite aus aufzurufen.
Transaktionswarteschlangen Aktualisierungen einer Datenbank von einem Remote-Server können dazu führen, dass Transaktionen aufgrund von Netzwerkverzögerungen oder -ausfällen verzögert oder beendet werden. Da alle Teile der Transaktion festgeschrieben werden müssen, bleibt die Anwendung möglicherweise hängen und wartet auf eine Festschreibungs- oder Abbruchnachricht vom Remote-Server, oder die Transaktion wird möglicherweise abgebrochen, weil Datenbankaktualisierungen nicht gesendet werden können.
Für Aktualisierungen, die gleichzeitig abgeschlossen werden müssen, besteht der richtige Ansatz darin, die Transaktion zu beenden oder den Abschluss der Transaktion zu verzögern, bis alle Teilnehmer der Transaktion in der Lage sind, sich zu verpflichten. Beispielsweise sollte der Buchungsprozess einer Fluggesellschaft gleichzeitig das Bankkonto des Kunden belasten und das Bankkonto der Fluggesellschaft gutschreiben. Wenn ein Update Teil einer Gesamttransaktion ist, aber möglicherweise später als andere Updates erfolgt, möchten Sie den Kunden möglicherweise nicht warten lassen, bis der gesamte Update-Vorgang abgeschlossen ist. Beispielsweise könnte eine Flugbuchungstransaktion auch eine Lebensmittelbestellung an einen Lebensmittellieferanten senden oder die Reisekostenpauschale eines Kunden aktualisieren. Obwohl diese Vorgänge abgeschlossen sein müssen, können sie später durchgeführt werden.
Mit dem Microsoft Message Queue Server können Sie ein Update oder eine Reihe von Updates in einer Transaktionsnachricht an einen Remoteserver bündeln. Der Message Queue Server garantiert, dass Updates auch dann an den Remote-Server gesendet werden, wenn das Netzwerk derzeit nicht verfügbar ist. Ihre App erhält eine Commit-Nachricht und kann mit der Verarbeitung der Transaktion fortfahren.